トピック
シャオヤンは金庫を申請しましたが、パスワードを忘れてしまいました。パスワードはすべて数字であり、すべての数字は一意であることに注意してください。
彼が覚えている数字の範囲とパスワードの最小数に基づいて可能な組み合わせを計算するのを手伝ってください。
ルールは次のとおりです。
1. 出力の組み合わせは任意の番号の範囲から選択され、繰り返すことはできません。
2. 出力されるパスワード番号は、小さいものから大きいものへの順序で並べる必要があります。最小値から最大値までアルファベット順に並べ替える必要があります。
3. 各組み合わせ出力の数字の数は、パスワードの最小数以上である必要があります。
4. 可能な組み合わせが空の場合、 「なし」を返します ;
説明を入力します。
1. 入力の最初の行は、半角カンマで区切られた、使用可能なパスワード番号のリストです。
2. 次のように入力します。の 2 行目は、パスワードの最小桁数です
出力の説明: 。
考えられるパスワードの組み合わせ。各組み合わせは 1 行に表示されます。各組み合わせ内の数字は半角カンマで区切られ、昇順です。 2,3,4 を 2,4 の前に置きます。 例:
出力の組み合わせは、辞書編集順に Q 並べ替える必要があります。
補足説明
ボックス内の文字で綴られた文字列とパスワードの一致では、大文字と小文字は区別されず、パスワードと完全に一致する必要があります。たとえば、パスワード abc は一致します。 aBc ですが、パスワード abc が一致しません。abcd
示例一
输入
2,3,4
出力
2,3
2,3,4
2,4
3,4
Javaコード
package day11;
import java.util.*;
public class passwordGuessing {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String[] numStrings = sc.nextLine().split(",");
int n = Integer.parseInt(sc.nextLine());//最小数字数量
List<List<Integer>> combinations = new ArrayList<>();
Arrays.sort(numStrings);//对数字列表进行排序
for(int i = n; i <=numStrings.length;i++){
generateCombinations(numStrings,i,0,new ArrayList<>(),combinations);
}
Collections.sort(combinations,(a,b)->{
for(int i=0;i<Math.min(a.size(),b.size());i++){
int compareResult = Integer.compare(a.get(i),b.get(i));
if(compareResult !=0){
return compareResult;
}
}
return Integer.compare(a.size(),b.size());
});
if(!combinations.isEmpty()){
for(List<Integer> combination:combinations){
StringBuilder sb = new StringBuilder();
for(int num:combination){
sb.append(num).append(",");
}
String combinationString = sb.toString();
System.out.println(combinationString.substring(0,combinationString.length()-1));
}
}else{
System.out.println("None");
}
}
private static void generateCombinations(String[] numString,int k,int start,List<Integer> current,List<List<Integer>> combinations){
if(k==0){
combinations.add(new ArrayList<>(current));
return;
}
for(int i=start;i<=numString.length-k;i++){
current.add(Integer.parseInt(numString[i]));
generateCombinations(numString,k-1,i+1,current,combinations);
current.remove(current.size()-1);//回溯,从当前组合中移除最后一个添加的元素,即回退到之前的状态。
}
}
}