トピック情報
int整数を入力し、右から左への読み取り順序に従い、番号を繰り返さずに新しい整数を返します。入力した整数の最後の桁が0でないことを確認してください。
入力例:9876673
サンプル出力:37689
回答
大きなアイデアは、入力を文字の配列に逆アセンブルし、順序付けられたセットに文字を格納することです。文字がすでにセットに含まれている場合はスキップし、そうでない場合は文字がセットに入れられます。コレクションは、ArrayListまたはDequeを選択できます。
ArrayListとDequeに基づいて、2つの実装メソッドが提供されます
コーディング
方法1、入力番号を逆にした後、文字はArrayListに格納され、出力されます
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class ReverseNonRepetitionIntegers {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input;
while ((input = br.readLine()) != null) {
// 输入数字逆序
StringBuffer sb = new StringBuffer(input);
sb.reverse();
// 逆序后数字转化为字符数组
char[] numArr = sb.toString().toCharArray();
// 遍历数组字符,并将字符入List
List<Character> list = new ArrayList<>();
for (char ch : numArr) {
if (list.contains(ch)) {
continue;
}
list.add(ch);
}
// 将list中不重复字符输出
StringBuffer returnSb = new StringBuffer();
for (char ch : list) {
returnSb.append(ch);
}
System.out.println(returnSb.toString());
}
}
}
方法2、入力番号を文字配列に変換し、キューの先入れ先出し機能を使用して、結果番号を出力します。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Deque;
import java.util.LinkedList;
public class ReverseNonRepetitionIntegers {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input;
while ((input = br.readLine()) != null) {
// 将输入数字转为字符数组
char[] numArr = input.toCharArray();
// 使用队列存放字符,利用队列先进先出特点,最终输出数字
Deque<Character> list = new LinkedList<>();
for (int i=numArr.length-1; i>=0; i--) {
if (!list.contains(numArr[i])) {
list.push(numArr[i]);
}
}
// 队列中有值时,使用pollLast方法,对先入队列的元素先出队列
while(list.size()>0) {
System.out.print(list.pollLast());
}
System.out.println();
}
}
}
上記の2つの実装方法、Niuke.comでの実行結果は次のとおりです。2番目の方法は実行時間が短く、使用するメモリが少なくなります。