[プログラマアルゴリズム]最大数


プログラマー練習問題
プログラマレベル2-最大数

🔎 質問する


0または正の整数を指定すると、最大の整数を見つけます.
例えば、与えられた整数が[6,10,2]である場合、最大数が6210である[610261010621026102106]を作成することができる.
パラメータに指定された配列番号が0または正の整数の場合、作成可能な最大番号を文字列に変換して戻すソリューション関数を作成します.

🚫 せいげんじょうけん


numbersの長さは1または10万以下です.
numbersの要素は1000を超えない.
答えが大きすぎるかもしれませんが、文字列に置き換えて返してください.

💻 I/O例



📄🤔 コードと解釈プロセス


🔹 1番

public static String solution(int[] numbers) {
        
	String answer = "";
        
	String[] strNum = new String[numbers.length];
        for (int i = 0; i < numbers.length; i++) {
		strNum[i] = String.valueOf(numbers[i]);
	}
        
        String temp;
        String forward = "";
        String reverse = "";
	for (int i = 0; i < strNum.length-1; i++) {
		for (int k = i+1; k < strNum.length; k++) {
			forward = strNum[i] + strNum[k];
			reverse = strNum[k] + strNum[i];
			if(reverse.compareTo(forward) > 0) {
				temp = strNum[i];
				strNum[i] = strNum[k];
				strNum[k] = temp;
			}				
		}//inFor
	}//outFor
		
	for (String s : strNum) {
		answer += s;
	}
		
	return (answer.substring(0, 1).equals("0"))? "0" : answer;
}

🔸 1号解


最初のコードは
とても簡単な方法で.
1番目の文字列+2文字列と2番目の文字列+1文字列.
compareToより2番目の文字列+1番目の文字列の方が大きいです.
2番目の文字列を1番目の文字列と交換する方法を選択しました.
配列を文字列に設定します.
アレイに複数の0が存在する場合は、次のような結果が得られます.
開始値が0の場合、0を返すか、そのまま並べた文字列を返します.
11のテストケースのうち6つが合格した.
5個がタイムアウトで失敗しました.
このコードを作成する前に、ネストされた重複文が使用されないことを確認してください.
文字列のソートフィーチャーを使用して、
Arrays.sort(strNum, Collections.reverseOrder());
降順で並べ替えると、
1番目の文字列と2番目の文字列の値の比較
2番目の文字列と3番目の文字列の値の比較
3番目の文字列と4番目の文字列の値をcomapreToなどと比較します.
(n文字列+n+1文字列).compareTo((n+1文字列+n文字列)
比較方法を使ってみました.
sortで降順で簡単にソート
{2,20,220}は{2,220,20}でソートする必要があります.
{220,20}などとソートされ、正常な答えは表示されませんでした.
だから私は重なった複文でそれを解かなければなりません.
タイムアウトでパスしなかったので再Arrayssortを使用します.
上記の問題が発生しない方法を見つけました.

🔹 2番

public static String solution(int[] numbers) {
    
	String answer = "";
	String[] strNum = new String[numbers.length];
    	for (int i = 0; i < numbers.length; i++) {
		strNum[i] = String.valueOf(numbers[i]);
	}
       
	Arrays.sort(strNum, new Comparator<String>() {
		@Override
		public int compare(String o1, String o2) {
        		return (o2 + o1).compareTo(o1 + o2);
                }        	
	});

	for (String s : strNum) {
		answer += s;
	}        
	
	return answer.startsWith("0") ? "0": answer;
}

🔸 第二題


1番コードでは、いろいろな問題を考えています.
sortメソッドのパラメータリストを表示すると、Comparatorが目に入ります.
並べ替えの場合、比較計測器Comparatorを使用して並べ替え基準を変更できます.
一度習ったのにすぐに思い出せなかったのが残念.
Arrays.sortを使用して文字列配列をソートします.
匿名クラスを使用して比較測定を作成します.
compareを上書きして比較する2つの文字列.
(文字列2+文字列1).compareTo(文字列1+文字列2)で比較します.
ソートは問題を通過しました.
匿名の授業も習った内容ですが、最初は覚えていませんでした.
測定器クラスを作成し、ジェネレータで比較測定器オブジェクトを作成することを考えたことがあります.
そしてネットでComparatorを再学習します.
オブジェクトの作成時に匿名クラスを使用する例を表示します.
この時使いましょう!作りながら使う.

😳❕ 感想&感想


ある时、学院の8时间の进度で、彼の复习、プロジェクト、やりたい勉强に対して
アルゴリズムを頭の後ろに置くのに忙しい.
もう一度反省した.どのように感じて毎回すべて反省しています...
ソートを学ぶ過程で、比較測定器も勉強しました.
匿名の授業も習ったことがあります.
この問題を解くには、最初は一つも活用できなかった.
学んだことがあっても、学んだことを何度も運用して覚えなければなりません.
後で似たようなことがあっても、私は身につけることができます.
アルゴリズム問題の解決は単純に論理を把握するだけだとは思わない.
私はずっと私が学んだことを思い出しています.
自分で作ったと思って、忙しくてもやり続けます.