using System;
using System.Diagnostics;
public class Test
{
public static bool IsUnique1(int num) {
int[] digits = new int[10];
num = Math.Abs(num);
while (num > 0) {
int r = num % 10;
num /= 10;
digits[r] ++;
if (digits[r] > 1) {
return false;
}
}
return true;
}
public static bool IsUnique2(int[] digits, int num) {
Array.Clear(digits, 0, 10);
num = Math.Abs(num);
while (num > 0) {
int r = num % 10;
num /= 10;
digits[r] ++;
if (digits[r] > 1) {
return false;
}
}
return true;
}
public static bool IsUnique3(int[] digits, int num) {
for (int i = 0; i < 10; i++)
digits[i] = 0;
num = Math.Abs(num);
while (num > 0) {
int r = num % 10;
num /= 10;
digits[r] ++;
if (digits[r] > 1) {
return false;
}
}
return true;
}
public static void Main()
{
int n = 20000000;
int[] digits = new int[10];
Stopwatch sw = new Stopwatch();
int sum = 0;
sw.Start();
for (int i = 1; i < n; i++) {
if (IsUnique1(i))
sum++;
}
sw.Stop();
Console.WriteLine("ElapsedNew={0}, sum={1}",sw.Elapsed, sum);
sum = 0;
sw = new Stopwatch();
sw.Start();
for (int i = 1; i < n; i++) {
if (IsUnique2(digits, i))
sum++;
}
sw.Stop();
Console.WriteLine("ElapsedPass={0}, sum={1}",sw.Elapsed, sum);
sum = 0;
sw = new Stopwatch();
sw.Start();
for (int i = 1; i < n; i++) {
if (IsUnique3(digits, i))
sum++;
}
sw.Stop();
Console.WriteLine("ElapsedLoop={0}, sum={1}",sw.Elapsed, sum);
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7CgpwdWJsaWMgY2xhc3MgVGVzdAp7CglwdWJsaWMgc3RhdGljIGJvb2wgSXNVbmlxdWUxKGludCBudW0pIHsKCQlpbnRbXSBkaWdpdHMgPSBuZXcgaW50WzEwXTsKCQludW0gPSBNYXRoLkFicyhudW0pOwoJCXdoaWxlIChudW0gPiAwKSB7CgkJCWludCByID0gbnVtICUgMTA7CgkJCW51bSAvPSAxMDsKCQkJCgkJCWRpZ2l0c1tyXSArKzsKCQkJaWYgKGRpZ2l0c1tyXSA+IDEpIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0KCXB1YmxpYyBzdGF0aWMgYm9vbCBJc1VuaXF1ZTIoaW50W10gZGlnaXRzLCBpbnQgbnVtKSB7CgkJQXJyYXkuQ2xlYXIoZGlnaXRzLCAwLCAxMCk7CgkJbnVtID0gTWF0aC5BYnMobnVtKTsKCQl3aGlsZSAobnVtID4gMCkgewoJCQlpbnQgciA9IG51bSAlIDEwOwoJCQludW0gLz0gMTA7CgkJCQoJCQlkaWdpdHNbcl0gKys7CgkJCWlmIChkaWdpdHNbcl0gPiAxKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgkJcmV0dXJuIHRydWU7CQoJfQoJCglwdWJsaWMgc3RhdGljIGJvb2wgSXNVbmlxdWUzKGludFtdIGRpZ2l0cywgaW50IG51bSkgewoJCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykKCQkJZGlnaXRzW2ldID0gMDsKCQludW0gPSBNYXRoLkFicyhudW0pOwoJCXdoaWxlIChudW0gPiAwKSB7CgkJCWludCByID0gbnVtICUgMTA7CgkJCW51bSAvPSAxMDsKCQkJCgkJCWRpZ2l0c1tyXSArKzsKCQkJaWYgKGRpZ2l0c1tyXSA+IDEpIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCQlyZXR1cm4gdHJ1ZTsJCgl9CgkKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKCXsKCQlpbnQgbiA9IDIwMDAwMDAwOwoJCWludFtdIGRpZ2l0cyA9IG5ldyBpbnRbMTBdOwoJCVN0b3B3YXRjaCBzdyA9IG5ldyBTdG9wd2F0Y2goKTsKCQkKCQlpbnQgc3VtID0gMDsKCQlzdy5TdGFydCgpOwoJCWZvciAoaW50IGkgPSAxOyBpIDwgbjsgaSsrKSB7CgkJCWlmIChJc1VuaXF1ZTEoaSkpCgkJCQlzdW0rKzsKCQl9CgkJc3cuU3RvcCgpOwoJCUNvbnNvbGUuV3JpdGVMaW5lKCJFbGFwc2VkTmV3PXswfSwgc3VtPXsxfSIsc3cuRWxhcHNlZCwgc3VtKTsKCQkKCQlzdW0gPSAwOwoJCXN3ID0gbmV3IFN0b3B3YXRjaCgpOwoJCXN3LlN0YXJ0KCk7CgkJZm9yIChpbnQgaSA9IDE7IGkgPCBuOyBpKyspIHsKCQkJaWYgKElzVW5pcXVlMihkaWdpdHMsIGkpKQoJCQkJc3VtKys7CgkJfQoJCXN3LlN0b3AoKTsKCQlDb25zb2xlLldyaXRlTGluZSgiRWxhcHNlZFBhc3M9ezB9LCBzdW09ezF9Iixzdy5FbGFwc2VkLCBzdW0pOwoJCQoJCXN1bSA9IDA7CgkJc3cgPSBuZXcgU3RvcHdhdGNoKCk7CgkJc3cuU3RhcnQoKTsKCQlmb3IgKGludCBpID0gMTsgaSA8IG47IGkrKykgewoJCQlpZiAoSXNVbmlxdWUzKGRpZ2l0cywgaSkpCgkJCQlzdW0rKzsKCQl9CgkJc3cuU3RvcCgpOwoJCUNvbnNvbGUuV3JpdGVMaW5lKCJFbGFwc2VkTG9vcD17MH0sIHN1bT17MX0iLHN3LkVsYXBzZWQsIHN1bSk7Cgl9Cn0=