圧縮プログラマ符号化テスト練習文字列

4335 ワード


この問題は本当に思い出せません.一つ一つ問題をして、コードが乱れています.
コードが簡潔に書かれるまで練習します.
import java.util.*;
import java.util.stream.*;

class Solution {
    public int solution(String s) {
        int strLength = s.length();
        var answerList = new ArrayList<Integer>();
        
        for (int i = 1; i <= strLength / 2+1; i++) {
            var temp = new ArrayList<String>();
            var tempStr = s;
            while(!tempStr.isBlank()){
                if(i > tempStr.length()){
                    temp.add(tempStr);
                    break;
                }
                String subStr = tempStr.substring(0, i);
                tempStr = tempStr.substring(i);
                temp.add(subStr);
            }

            String previous = "";
            int num = 0;
            StringBuilder string = new StringBuilder();
            for(var str : temp){
                if(num == 0){
                    previous = str;
                    num++;
                    continue;
                }
                if (str.equals(previous)) {
                    num++;
                }else{
                    if (num == 1) string.append(previous);
                    else string.append(num).append(previous);
                    previous = str;
                    num = 1;
                }
            }
            if (num == 1) string.append(previous);
            else string.append(num).append(previous);
            answerList.add(string.length());
        }
        
        return answerList.stream().mapToInt(Integer::intValue).sorted().findFirst().getAsInt();
    }
}

説明:


その字号は半+一で、
1.まず文字を該当する個数に分ける.
2.これに基づいて、前の文字列を現在の文字列と比較し、同じ場合numを増やします.
while(!tempStr.isBlank()){
    if(i > tempStr.length()){
        temp.add(tempStr);
        break;
    }
    String subStr = tempStr.substring(0, i);
    tempStr = tempStr.substring(i);
    temp.add(subStr);
}
ここで、iは重複文字列サイズ/2+1のインデックスである.
つまり、行間の大きさ.
加工する文字列が空の文字列でないまで
区切り文字のサイズが現在の残りの文字列のサイズより大きい場合、
(substringが必要ですが、残りは2文字、切り離す必要があるのが5文字の場合は例外を投げ出します)
この状態でtempという名前のリストに追加し、重複を終了します.
そうでなければ、残りの文字列のi未満の文字列をtempというリストに入れます.
残りの文字列の状態をiから終了に変更します.
こうしてwhile終了時にSystem.out.printlnで確認すると


よく割れているのが見えます.
この文字が表示されるたびに、前の文字列と現在の文字列が比較されます.
数字と字を伝えればいいです.
String previous = ""; // 이전의 글자
int num = 0; // 초기값은 0, 이후 0에 도달할 일이 없음.
StringBuilder string = new StringBuilder(); // 가공된 글자를 표현하기 위함 ( 결과 )

for(var str : temp){
    if(num == 0){
        previous = str;
        num++;
        continue;
    }
    if (str.equals(previous)) {
        num++;
    }else{
        if (num == 1) string.append(previous);
        else string.append(num).append(previous);
        previous = str;
        num = 1;
    }
}
if (num == 1) string.append(previous);
else string.append(num).append(previous);
answerList.add(string.length());
tempリストの文字で繰り返す
最初のnumが0の場合、前の文字を現在の文字列として数値を増やし、次の文字列にジャンプします.
△その後numは決してゼロではありません.
文字列が前の文字列と同じ場合はnumが増加します.
文字列が異なる場合
numが1の場合、1は作成できませんので、結果文字列変数には1以外の前の文字のみが追加されます.
numを1に再変換し、以前の文字も値を再入力します.
if (num == 1) string.append(previous);
else string.append(num).append(previous);
answerList.add(string.length());
ループに最後の文字列がcccの場合
この場合、加工する文字に重複を追加することはできません.
繰り返し完了したら、最後に文字列に挿入する操作を実行します.
「回答リスト」に、処理済み文字列のサイズを入力します.
return answerList.stream().mapToInt(Integer::intValue).sorted().findFirst().getAsInt();
答えのリストには文字の大きさがあります.
リストをstreamからintに変更します.
昇順で並べ替えた後、最初に現れた要素をint型に戻します.

に感銘を与える


以前はできなかったようなコーディングテストがだんだん解けてきました.
第3段階まで頑張りましょう