前提・実現したいこと
1.
sortメソッドで、引数で渡した文字列の全パターンの並び順をListに追加していきたいです。
実際は、戻り値を表示させてもなにも追加されていません。
原因がわかりません。
例:123の文字列の全パターンの並び順↓の文字列を1つずつListに追加していきたいです。
123
132
213
231
312
321
2.
sortメソッドで、得た全並び順の数値を比較していきたいです。
今のコードだと隣り合う数値しか比較できませんが、1つとばしや、2つとばしなど
入力されたどんな桁数でも全部の比較をしていきたいです。
どんなアルゴリズムでしていけばいいでしょうか。
追記しました。
最終的にはやりたいことです。
123には、それぞれに下記のように数値が割り振られているので自分よりも大きい数値が前にあれば割り振られた数値を加算していき合計を求めたいです。
1には3
2には2
3には1
例:
123 → 番号順なのでOK
132 → 3が2より大きい → 2
213 → 2が1より大きい → 3
231 → 23が1より大きい → 3+3=6
312 → 3が1,2より大きい → 2+3=5
321 → 3が2より大きい、3,2が1より大きい → 2 + 3+3 = 8
説明がうまくできていなく、わかりずらくすみません。
よろしくお願いいたします。
import
1 2 3public class Main { 4 /* 5 ・1行目に猫の数 N 、許容される不満度の合計 M 6 ・2行目から N 行に、食べる時間 ai と不満度 bi 7 不満度が超えない組み合わせのみ、食事の時間を計算し最小値を比較 8 組み合わせは nPn = n! = n * (n - ) * ... 3P = 3*2*1 = 6通りの並び方がある 9 最小値を表示 10 11 不満度が M を越えないように並び替えた時の食事にかかる時間の合計の最小値を出力 12 */ 13 public static void main(String[] args) { 14 Scanner sc = new Scanner(System.in); 15 16 int catNum = sc.nextInt(); //猫の数 17 int hateMax = sc.nextInt(); //不満度の教養範囲 18 19 int[] eatTime = new int[catNum]; //各猫の食事の時間 20 int[] hate = new int[catNum]; //各猫の不満度 21 String catNo = ""; //各猫につけた番号 22 23 for (int i = 0; i < catNum; i++){ 24 //猫の数分、食事時間と不満度、猫の番号を配列に格納 25 eatTime[i] = sc.nextInt(); 26 hate[i] = sc.nextInt(); 27 catNo += i; 28 29 // System.out.println(eatTime[i] + " " + hate[i] + " " + catNo); 30 } 31 List<String> result = new ArrayList<>(sort(catNo,"",hate)); 32 System.out.println(result); 33 } 34 //全組み合わせを列挙するメソッド 35 /* 36 i番目の文字を抜いた文字列とans+i番目の文字列が、次のpermutationのq, ansになります 37 qは再帰のたびにどんどん短くなり、最終的に1文字になったらansに連結したものが出力されます。 38 i番目を抜いて連結するというのを繰り返すので最終的に全組み合わせを列挙することができます、 39 */ 40 static List<String> sort(String catNo, String ans,int[] hate){ //q=選択候補の文字列、ans=選択済みの文字列 41 42 int len = catNo.length(); 43 //System.out.println("呼び出し:q= " +q + " ans= " + ans); 44 List<String> result = new ArrayList<>(); 45 if(len <= 1) { 46 // System.out.println(ans + catNo); 47 // System.out.println("calcメソッド呼ぶよ"); 48 //String str = ans + catNo; 49 result.add(ans + catNo); 50 // calc(result,hate); 51 }else { 52 53 for (int i = 0; i < len; i++) { 54 //System.out.println("ループ" + i + "回目(q=)" + q + "-------------------------"); 55 //System.out.println( q.substring(0, i) + "," + q.substring(i + 1) + "," + ans + "," + q.charAt(i)); 56 57 sort(catNo.substring(0, i) + catNo.substring(i + 1),ans + catNo.charAt(i),hate); 58 } 59 } 60 61 return result; 62 } 63 //隣り合う不満度を計算するメソッド 64 static void calc(String catNo,int[] hate){ 65 66 int len = catNo.length(); 67 int sum = 0; 68 //隣り合う数値で右の数値のが小さい(=順番を抜かされた)不満度を加算 69 for (int i = 0; i < len; i++){ 70 if(i == len - 1){ 71 break; 72 } 73 //1文字ずつcharをintに変換 74 int left = Character.getNumericValue(catNo.charAt(i)); 75 int right = Character.getNumericValue(catNo.charAt(i + 1)); 76 //不満度を加算 77 //System.out.println(left + " " + right); 78 if(left > right){ 79 sum += hate[right]; 80 } 81 } 82 System.out.println("sum=" + sum); 83 } 84 85} 86コード
回答1件
あなたの回答
tips
プレビュー