問題 5: 文字列に対する興味深い操作


第5期
PS: 各質問に対する解決策は一意ではありません。議論することを歓迎します。各質問の後には、質問の分析と解決に役立つ分析があり、答えは下部にあり、ブロガーは毎日更新し続けます。

1. スペースを置換する

タイトル 説明
文字列 s 内の各スペースを "%20" に置き換える関数を実装してください。
例 1:
入力: s = "We are happy."
出力: "We%20are%20happy"
例 2:
入力: s = "hello world."
出力: s = "hello%20world."
解析:
Java の場合、We文字列自体は直接変更できないため、新しい文字列でのみ実現できることを知っておく必要があります。
そこでアイデアがあり、新しい文字列を作成し、古い文字列を走査し、新しい文字列がスペースの場合は %20 を追加し、スペースでない場合はこの文字を直接追加し、最後に走査を完了して文字を取得します。 string は私たちが望む結果です。(方法1)
注:

  • 新しい文字列を作成するには、String 型を作成することはできません。String は追加時に常に新しい文字列を作成し、大量のメモリを消費するため、StringBuilder を作成する必要があります。
    -ライブラリメソッド replace() を使用することもできますが、これでは質問をブラッシュアップする意味が失われ、面接中、面接官はそのようなコードを見たくないでしょう。(方法2)

2. 文字列の左回転

タイトルの説明
文字列の左回転操作は、文字列の前のいくつかの文字を文字列の末尾に移動することです。文字列の左回転操作の機能を実現する関数を定義してください。たとえば、文字列「abcdefg」と数値 2 を入力すると、関数は 2 ビット左回転した結果「cdefgab」を返します。
例 1:
入力: s = "abcdefg"、k = 2
出力: "cdefgab"
例 2:
入力: s = "lrloseumgh"、k = 6
出力: "umghlrlose"
分析:
この質問には難しい方法があります。 is スライス関数を適用して文字列をスライスし、substring() ライブラリ メソッドを呼び出します。(方法 1)。
面接ではこの方法が許可されない可能性があるため、別の方法を使用することができます。
トラバーサル スプライシングをリストし、StringBuilder の文字列を作成し、k + 1 を末尾の文字まで順に連結し、最初の文字を k に連結して、最後に文字列を返します。(方法2)
文字を回転させてもできますが、面倒なので、まず文字列を文字配列に変換し、次に0~k-1、k~arr.length-1の座標要素を回転させ、最後に文字列を回転させます。配列全体を回転し、この配列を文字列に変換すると、必要な結果が得られます。(方法3)

3. 回答コード

3.1 スペースを置換する

	//方法一
    public String replaceSpace(String s) {
        StringBuilder stringbuilder = new StringBuilder();
        int len = s.length();
        for(int i = 0; i < len; i++){
            char ch = s.charAt(i);
            if(ch == ' '){
                stringbuilder.append("%20");
            }else{
                stringbuilder.append(ch);
            }
        }
        return stringbuilder.toString();
    }
    
    //方法二 
	public String replaceSpace(String s) {
    	return s.replace(" ", "%20");
	}

3.2 文字列の左回転

	//方法一
    public String reverseLeftWords(String s, int n) {
        return s.substring(n) + s.substring(0, n); 
    }
    
    //方法二
    public String reverseLeftWords(String s, int n) {
        StringBuilder res = new StringBuilder();
        for(int i = n; i < s.length(); i++){
            res.append(s.charAt(i));
        }
        for(int i = 0; i < n; i++){
            res.append(s.charAt(i));
        }    
        return res.toString();
    }
       
    //方法三
    public String reverseLeftWords(String s, int n) {
        char[] arr = s.toCharArray();
        reverse(arr, 0, n - 1);
        reverse(arr, n, arr.length - 1);
        reverse(arr, 0, arr.length - 1);
        s = new String(arr);
        return s;
    }
    public void reverse(char[] arr, int left, int right){
        while(left < right){
            char tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
            left++;
            right--;
        }
    }

おすすめ

転載: blog.csdn.net/weixin_73392477/article/details/131110815