хорошо, несколько заметок:
- Ваше предположение начать с 40 неверно, поскольку 4 * 1783 = 6952 является пандигитальным. И есть еще один, которого вам не хватает:)
- Вы не исключаете дубликаты продуктов.
Основываясь на обсуждении с Мариусом, я обновляю оригинальный ответ здесь.
Это только метод isPandigital.
private boolean isPandigital(int a,int b){
int c=a*b;
StringBuilder st = new StringBuilder();
st.append(a).append(b).append(c);
if (st.length()!=9 || st.indexOf("0")>-1) return false;
Set<Character> x=new TreeSet<Character>();
for (int i=0;i<9; i++){
x.add(st.charAt(i));
}
if (x.size()==9){
for (int k=0;k<=cnt;k++){
if (products[k]==c) return false;
}
products[++cnt]=c;
total += c;
return true;
}
return false;
}
Я сравнил оба кода на моей машине, десять попыток затем усредняются, результаты выглядят следующим образом:
- Код Мариуса: средний (2070 мс)
- код медопалы: средний (2200 мс)
- код Мариуса (с использованием строки): среднее (4200 мс)
- код медопалы (с использованием строки): среднее (5000 мс)
Я добавил сравнение String vs StringBuilder, потому что, к сожалению, именно это сделало мой оригинальный код таким медленным. Но используя StringBuilder, код Marius выигрывает у меня в среднем только за 200 мс:)
Извлеченные уроки:
- StringBuilder занимает почти половину времени String. (по крайней мере, в этом эксперименте)
- Когда вам лень думать, вы можете использовать готовые структуры. (снова в этом эксперименте по крайней мере), я не обобщаю
Спасибо, Мариус:)