Как реализовать концепцию duodigit в java

#java

Вопрос:

я пытаюсь решить проблему с концепцией duodigit на java.

Вот он:

Мы называем duodigit целым числом, в десятичном представлении которого используется не более двух разных цифр.

Например :

  • 12 , 110 , -33333 : все они являются двенадцатиперстными , так как у них не более двух разных цифр
  • 102 : не является дуодигитом , так как его цифры 1, 0 и 2-это три разные цифры.

Реализуйте isDuoDigit(number) метод, который возвращает строку:

  • y если number это двенадцатиперстная кишка
  • n иначе

пример:

введите описание изображения здесь

 public class Solution {

    public static String isDuoDigit(int number){
        /* Write your code here */

    return "";
    }
}

 

Поэтому я придумал это решение:

 public class Solution_duoDigit {

    public static String isDuoDigit(int number) {
        /* Write your code here */
        Set<Integer> set= new HashSet<>();
        set.add(number);
        if(set.size()<=2){
            return "y";
        }else{
            return "n";
        }
        
    }

    public static void main(String[] args) {

        System.out.println(Solution_duoDigit.isDuoDigit(12));
        System.out.println(Solution_duoDigit.isDuoDigit(110));
        System.out.println(Solution_duoDigit.isDuoDigit(102));
        System.out.println(Solution_duoDigit.isDuoDigit(-2021));

    }
}

 

Но мое решение не завершено и не работает, потому что я не знаю, как выразить тот факт, что в коде Java не более двух разных цифр.
Вы можете мне помочь, пожалуйста?

Комментарии:

1. Йо мог бы сложить цифры в а Set и проверить длину набора.

2. Да , в наборе элементы уникальны , это хорошая идея,спасибо

3. @luk2302 , я отредактировал свой код с помощью интерфейса набора, но есть небольшая проблема: он не возвращает «n» для «-2021».

4. Теперь вы добавляете целое число в набор, в результате чего получается набор только с 1 элементом. Вместо этого добавьте отдельные цифры в набор

5. @Рик, да,вы правы,я должен добавить отдельную цифру, используя String.valueOf(number).charAt(i) » я » в качестве индекса персонажа, я делаю это прямо сейчас, спасибо

Ответ №1:

Вы можете использовать .chars() :

 public static String isDuoDigit(int number) {
    boolean isDuoDigit = Integer.toString(number).replace("-", "").chars().distinct().count() <= 2;
    return isDuoDigit ? "y" : "n";
}
 

В качестве альтернативы вы можете сделать:

 public static String isDuoDigit(int number) {
    boolean isDuoDigit = Integer.toString(Math.abs(number)).chars().distinct().count() <= 2;
    return isDuoDigit ? "y" : "n";
}
 

Затем:

 System.out.println(isDuoDigit(12));
System.out.println(isDuoDigit(110));
System.out.println(isDuoDigit(-3333));
System.out.println(isDuoDigit(102));
 

Выход:

 y
y
y
n
 

Комментарии:

1. Извините, мне нужно только вернуть строку «y», если это duogit, или «n» в противном случае, но в вашем решении вы возвращаете логическое значение «true» или «false», это не совсем то, о чем меня спрашивали

2. Это самая легкая часть… Я изменил ответ, чтобы вернуть a String .

Ответ №2:

Что ж, использование a Set -неплохая идея, так как оно устраняет дубликаты.

Проблема с вашим текущим кодом заключается в том, что вы добавляете целое число в набор, в результате чего набор имеет только одно значение.

Что вам нужно сделать, так это добавить каждую цифру отдельно в набор.

Тебе нужно сделать несколько вещей:

  • Удалите любой знак, так как это, очевидно, не считается цифрой;
  • Получите каждую цифру отдельно;
  • Для каждой цифры добавьте ее в набор;
  • Получите размер набора.
 String s = Integer.toString(Math.abs(number));
Set<Character> set = new HashSet<>();
for (int i = 0; i < s.length(); i  ) {
    char c = s.charAt(i);
    set.add(c);
}
return (set.size() <= 2 ? "y" : "n");
 

Примечание: Вместо этого я мог бы использовать потоки Java, но я не уверен, что вы к ним уже привыкли. Вот однострочное использование потоков:

 return Integer.toString(Math.abs(number)).chars().distinct().count() <= 2 ? "y" : "n";
 

Но это действительно в значительной степени то, что Гобой уже сказал в своем ответе.

Комментарии:

1. спасибо за ваше решение, оно работает ,я очень хорошо знаю Java Stream,я постараюсь его использовать ,я думаю, что буду использовать IntStream с помощью distinct (), например Intstream(number).distinct() , я прав?

Ответ №3:

а также вы можете использовать приведенное ниже,

         int i = -3333;
        String s = String.valueOf(i).replace("-", "");
        Map<Integer, Integer> map = new HashMap<>();
        for (int j = 0; j < s.length(); j  ) {
            map.merge((int) s.charAt(j), 1, Integer::sum);
        }
        long count = map.values()
                        .size();
        System.out.println(count > 2 ? "true" : "false");