アルゴリズム通関村 - 単純な文字列変換の問題ではない

1. 小文字に変換する

文字列 s を指定すると、その文字列内の大文字を同じ小文字に変換し、新しい文字列を返します。
小文字に変換する

1.1 利用ASCII

まず、一般的な ASCII 値
az: 97-122
AZ: 65-90
0-9: 48-57

を取得する必要があります。最初にこの文字列を文字に変換し、その後、文字 +32 を対応する小文字にするだけです。文字を入力し、文字列に変換された文字配列を変換します。

   public String toLowerCase(String s) {
    
    
        char [] chars = s.toCharArray();
        for(int i=0;i<s.length();i++){
    
    
            if(chars[i] >= 65 && chars[i]<=90){
    
    
                chars[i] += 32;
            }
        }
        String str = new String(chars);
        return str;
    }

2. 文字列を整数に変換する (atoi)

文字列から整数へ (atoi)
文字列を 32 ビット符号付き整数に変換するには、myAtoi(string s) 関数を実装してください (C/C++ の atoi 関数と同様)。

関数 myAtoi(string s) のアルゴリズムは次のとおりです。

文字列を読み取り、不要な先頭の空白を破棄します。
次の文字 (文字の終わりにまだ到達していないものとします) にプラス記号またはマイナス記号があるかどうかを確認し、存在する場合はその文字を読み取ります。最終結果が陰性か陽性かを決定します。どちらも存在しない場合、結果は肯定的なものとみなされます。
次の非数字文字に到達するか、入力の終わりに到達するまで、次の文字を読み取ります。文字列の残りの部分は無視されます。
前の手順で読み取ったこれらの数値を整数に変換します (つまり、「123」 -> 123、「0032」 -> 32)。数値が読み込まれなかった場合、整数は 0 になります。必要に応じてシンボルを変更します (手順 2 から)。
整数の数が 32 ビット符号付き整数の範囲 [-231, 231 − 1] を超える場合、この範囲内に収めるために整数を切り捨てる必要があります。具体的には、 -231 より小さい整数は -231 に固定され、231 − 1 より大きい整数は 231 − 1 に固定されます。
最終結果として整数を返します。
知らせ:

この質問の空白文字には、スペース文字「 」のみが含まれます。
先頭のスペースまたは数字の後の文字列の残り以外の文字を省略しないでください。

2.1

話題によれば

  1. 渡された文字列は最初にその中のスペースを削除する必要があります
  2. 次に、数値の正負を判断します。正負を示す記号を使用できます。
  3. 文字が数字かどうかもASCIIで判断する必要がある
  4. 最初に見つかった文字が数字でない場合は終了します。
  5. 数字は1桁目*10+2桁目を採用
    public int myAtoi(String s) {
    
    
        int length = s.length();
        char [] chars = s.toCharArray();
        // 去除空格
        int index =0;
        while(index<length && chars[index] == ' '){
    
    
            index++;
        }

        // 遍历完成
        if(length == index){
    
    
            return 0;
        }

        // 判断正负
        int sign =1;
        char firstChar = chars[index];
        if(firstChar == '+'){
    
    
            index++;
        }else if(firstChar == '-'){
    
    
            index++;
            sign = -1;
        }

        // 转换数字
        int res =0;
        while(index<length){
    
    
            char currentChar = chars[index];
            // 不合法
            if(currentChar >'9' || currentChar<'0'){
    
    
                break;
            }

            // 避免溢出
            if(res > Integer.MAX_VALUE/10 ||(res == Integer.MAX_VALUE / 10 && (currentChar - '0') > Integer.MAX_VALUE % 10)){
    
    
                return Integer.MAX_VALUE;
            }
            if(res<Integer.MIN_VALUE/10 ||(res == Integer.MIN_VALUE / 10 && (currentChar - '0') > -(Integer.MIN_VALUE % 10))){
    
    
                return Integer.MIN_VALUE;
            }

            res = res*10+sign*(currentChar - '0');
            index ++;
        }
        return res;
    }

アイデアはありますが、オーバーフローの状況をどのように判断するかなど、実際の運用はまだ少し難しいです。

おすすめ

転載: blog.csdn.net/qq_52843958/article/details/132363680