Проверка что в числе нет посторяющихся цифр

145
09 марта 2018, 14:56

Есть задачка, найти сколько чисел до 1000 в которых не повторяются цифры. Пытаюсь решить простым перебором, каждого числа в стринг и далее проверяю каждое число на совместимость. 1. Правильно ли я делаю 2. Как можно вычислить это все в уме, что то не вижу выделенной логики что не повторящиеся цифры до 100 это 91, а до 1000 это 739.

public static void main(String[] args) {
    int count = 91;
    for (int i = 100; i < 1000; i++) {
        String s = String.valueOf(i);
        if (s.charAt(0) == s.charAt(1) || s.charAt(0) == s.charAt(2) || s.charAt(1) == s.charAt(2)) {
            continue;
        }
        count++;
    }
    System.out.println(count);
}
Answer 1

Логика здесь простая. Однозначных чисел в нас 9 (исключим 0), все подходят под условие.
Дальше, считаем сколько двузначных. Для этого берем все однозначные, и дописываем одну цифру. Что бы цифры не повторялись, у нас есть только 9 вариантов. Итого, количество двузначных чисел, которые подпадают под условие:

9 * 9 = 81

Количество нужных чисел от 0 до 99 будет:

1 + 9 + 81 = 91 // 0 + однозначные + двузначные

Количество трехзначных чисел: берем все двузначные и дописывает 1 цифру. Всего вариантов на новую цифру уже 8:

81 * 8 = 648

Количество нужных чисел от 0 до 999 будет:

91 + 648 = 739 // (от 0 до 99) + трехзначные

И т. д.

Answer 2

Ну если перебором, так уже делать по уму

int countDup(int from, int to) {
  int res = 0;
  Set<Integer> nums = new HashSet<>();
  for (int i = from; i <= to; i++) {
    nums.clear();
    int cur = i;
    boolean dups = false;
    do {
      if (!nums.add(cur % 10) {
        dups = true;
        break;
      }
      cur /= 10;
    } while (cur != 0);
    if (!dups)
      res++;
  }
  return res;
}
System.out.println(countDup(0, 1000));
Answer 3

Как можно вычислить это все в уме, что то не вижу выделенной логики что не повторящиеся цифры до 100 это 91, а до 1000 это 739.

  • С 0 по 9 повторяющихся цифр быть не может - ответ 10.
  • С 10 по 99 числа с повторяющимися цифрами имеют вид XX - таких чисел 9.
    Получается 99 - 10 + 1 - 9 = 81.
    Соответственно с 1 по 99 ответ 10 + 81 = 91.
  • Со 100 по 999 есть варианты повторений XXY, XYX, YXX и XXX.
    Таких вариантов (10-1)*(10-1) + (10-1)*(10-1) + (10-1)*(10-1) + 9 = 252.
    10-1 - первая цифра не может быть 0, а другая не может быть первой, но может 0. Получается 999 - 100 + 1 - 252 = 648.
    Соответственно с 1 по 999 ответ 91 + 648 = 739.

Ну и проверка перебором:

res=0; 
for (x=0; x<1000; ++x) res += !/(.).*\1/.test(x) 
console.log(res)

READ ALSO
День недели и месяц с заглавной в SimpleDateFormat

День недели и месяц с заглавной в SimpleDateFormat

Для вывода даты используя формат в таком виде:

166
Сравнение картинок на сходство

Сравнение картинок на сходство

Как сравнить картинку 1 и картинку 2 ?

309
Шифрование UDP java

Шифрование UDP java

Нужно шифровать UDP соединение c помощью TLS, JSSE вроде бы поддерживает DTLS, но я не могу найти примеровНекоторые говорят, вообще вроде бы deprecated,...

207
Как отсортировать файл со строками в java? [требует правки]

Как отсортировать файл со строками в java? [требует правки]

Добрый день! Подскажите как отсортировать файл со строками в java?

198