#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");