我根據以下方法得到了結果,但我不滿意。
我想要一些其他方式和有效的方式來獲得預期的輸出。
輸入:
112341
輸出:
1234
輸出中不應顯示重復項,并且答案必須是1234.
我的解決方案:
public class PrintUnique {
public static void main(String[] args) {
int result = printUniquNums(112341);
System.out.println(result);
}
private static int printUniquNums(int num) {
String nums = Integer.toString(num);
char [] ch = nums.toCharArray();
Set<Character> store = new LinkedHashSet<>();
String res = "";
for (int i = 0; i < ch.length; i ){
if (store.add(ch[i])){
res = ch[i];
}
}
return Integer.parseInt(res);
}
}
uj5u.com熱心網友回復:
對 Java lambda 和流進行了一些調整。你的代碼也不錯。
public static void main(String[] args) {
int result = printUniquNums(112341);
System.out.println(result);
}
private static int printUniquNums(int num) {
String nums = Integer.toString(num);
List<String> digits = List.of(nums.split(""));
Set<String> uniqueDigits = new HashSet<>();
String uniqueNum = digits.stream().filter(uniqueDigits::add).reduce(String::concat).orElse(""); // set add method returns true if value not present
return Integer.parseInt(uniqueNum);
}
uj5u.com熱心網友回復:
這在性能方面并不是更有效。但它的代碼行數更少,更容易閱讀,這在大多數情況下更重要。
private static int printUniquNums(int num) {
TreeSet<String> tree= new TreeSet<>();
for (char c : Integer.toString(num).toCharArray()) {
tree.add(String.valueOf(c));
}
return Integer.parseInt(String.join("", tree));
}
uj5u.com熱心網友回復:
另一種不使用字串的方法意味著將數字除以 10 以將數字的數字減一并從左到右收集 a 中的每個數字Set,特別是 aLinkedHashSet以保持插入順序。然后,使用流來重建沒有重復數字的數字:
public static int uniqueNumber(int num) {
int temp;
Set<Integer> set = new LinkedHashSet<>();
while (num > 10) {
temp = (int) Math.pow(10, Math.ceil(Math.log10(num)) - 1);
set.add(num / temp);
num %= temp;
}
set.add(num);
Integer[] digits = set.toArray(new Integer[set.size()]);
return IntStream.range(0, digits.length)
.map(i -> digits[i] * ((int) Math.pow(10, (digits.length - 1) - i)))
.reduce(0, (a, b) -> a b);
}
輸出
1234
這是測驗代碼的鏈接:
https://www.jdoodle.com/iembed/v0/rSi
uj5u.com熱心網友回復:
您的方法可以使用Stream API重新實作。
最簡單的方法之一是創建一個代碼點流。
然后我們需要申請distinct()以確保流元素的唯一性。此操作LinkedHashSet在后臺利用 a 來拒絕重復并保留初始順序。
collect()最后,通過用作執行可變歸約StringBuilder的容器來應用終端操作。
private static int printUniquNums(int num) {
String result = String.valueOf(num).codePoints() // generating a stream of code points
.distinct() // ensure uniqueness
.collect(StringBuilder::new, // mutable container
StringBuilder::appendCodePoint, // defining how values should be accumulated in the container
StringBuilder::append) // how to merge the containers obtained while executing the stream in parallel
.toString();
return Integer.parseInt(result);
}
實作此目的的另一種方法是將流元素映射String到型別并利用內置收集器 joning()來處理流連接:
private static int printUniquNums(int num) {
String result = String.valueOf(num).codePoints() // generating a stream of code points
.distinct() // ensure uniqueness
.map(Character::getNumericValue) // getting a numeric value from a code point
.mapToObj(String::valueOf) // creating a single-character string
.collect(Collectors.joining()); // combining the strings together
return Integer.parseInt(result);
}
public static void main(String[] args) {
int result = printUniquNums(112341);
System.out.println(result);
}
輸出(對于兩種解決方案):
1234
在線演示的鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/486085.html
上一篇:更改forEach中的變數值
