【54】スペースを入れ替える|リンクリストを最後から最初まで印刷する

スペースを置き換える

問題の説明

文字列sの各スペースを「%20」に置き換える関数を実装してください。

問題解決のアイデア

文字列をトラバースします。スペースが見つかった場合は、新しい文字列をスペースの前の段落+ "%20" +スペースの後の段落と等しくします。

class Solution {
    
    
    public String replaceSpace(String s) {
    
    
        for(int i=0; i<s.length(); i++){
    
    
            if(s.charAt(i) == ' '){
    
    
                s = s.substring(0,i) + "%20" + s.substring(i+1);
                i+=2; //注意因 %20 而导致的序号增大
            }
        }
        return s;
    }
}

時間計算量:O(n 2)substring()メソッドの時間計算量はO(n)です。
空間計算量:O(1)

時間のために空間を変える方法:

class Solution {
    
    
    public String replaceSpace(String s) {
    
    
        String res = "";
        int n =s.length();
        for(int i=0; i<n; i++){
    
    
            char c = s.charAt(i);
            switch(c){
    
    
                case ' ' :
                    res += "%20";
                    break;
                default:
                    res += c;
                    break;
            }
        }
        return res;
    }
}

時間計算量:O(n)
スペース計算量:O(n + 2k)(nは元の文字列の長さ、kはスペースの数)

このソリューションは、ダブルポインターのアイデアを提供し、最初にスペースの数を数え、次に必要なスペースを事前に文字列に追加します。次に、1つのポインターが新しい文字列の最後の位置を指し、他のポインターがを指します元の文字列最後の要素については、要素がスペースの場合は「%20」で埋め、それ以外の場合は、2つのポインターが指す要素を等しくします。2つのポインターが同じ位置を指している場合は、ループから飛び出します。

小さな要約

substring()メソッドの使用法:

  1. substring(int beginIndex) form
    このメソッドは、文字列の一部をインデックス位置から最後まで抽出するために使用されます。呼び出すとき、抽出される文字列の開始位置は括弧内にあり、メソッドの戻り値は抽出された文字列です。

  1. このメソッドの部分文字列(int beginIndex、int endIndex)形式は、開始インデックスに対応して取得された文字列を含む、取得された開始インデックスbeginIndexを示します。endIndexインデックスは終了を示し、文字列はインデックスに対応して取得された終了に含まれません。キャラクター。このメソッドは、位置beginIndexと位置endIndexの間の文字列部分を抽出するために使用されます。

注意:

開始位置beginIndexの場合、Javaは文字列の最初の文字インデックスを0として処理しますが、終了位置endIndexの場合、Javaは文字列の最初の文字インデックスを1として処理します。

リンクリストを最後から最初まで印刷する

問題の説明

リンクリストのヘッドノードを入力し、各ノードの値を最後から最初まで返します(配列で返します)。

問題解決のアイデア

最初にリンクリストの長さを見つけ、結果を格納する配列に適切なメモリサイズを適用し、リンクリストを再度トラバースし、その値を配列に後ろから前に格納します。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    
    
    public int[] reversePrint(ListNode head) {
    
    
        int n = getListLength(head);
        int res[] = new int[n];
        for(int i=n-1;i>=0;i--){
    
    
            res[i] = head.val;
            head = head.next;
        }
        return res;
    }

    public int getListLength(ListNode head){
    
    
        int n = 0;
        while(head != null){
    
    
            n++;
            head = head.next;
        }
        return n;
    }
}

時間計算量:O(n)
空間計算量:O(n)

おすすめ

転載: blog.csdn.net/qq_43424037/article/details/114871878