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--;
}
}