Likou Brushing Hundred Days Plan Day6文字列変換整数(atoi)C#

学習目標:

私はあなたに異なる思考の拡張をもたらすことを望んで、私のユニークなアルゴリズムのアイデアを更新し続けます!
役に立ったら、いいね、フォロー、サポートしてください!
あなたの励ましは私を動かし続けるものです!

歴口質問銀行質問8公式リンク


学習コンテンツ:

文字列から整数(atoi)

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。

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

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

この質問の空白文字には、スペース文字''のみが含まれます。
先頭のスペースまたは数字の後の文字列の残りの部分を除いて、他の文字を省略しないでください。

例1:

入力:s =“ 42”出力:42説明:太字の文字列は読み込まれた文字であり、caretは現在読み込まれている文字です。ステップ1
: "42"(先頭にスペースがないため、現在文字は読み取られません)
^ステップ2: "42"('-'または'+'がないため、現在文字は読み取られません)
^ステップ3: "42 "(" 42 "を読み取ります)
^は整数42に解析されます。「42」は[-231、231 -1]の範囲にあるため、最終結果は42になります。

例2:

入力:s = "-42"出力:-42説明:ステップ1: "-42"(先頭のスペースを読み取りますが、無視します)
^ステップ2: "-42"('-'文字を読み取るため、結果は次のようになります。負の数)
^ステップ3:「-42」(「42」を読み取る)
^解析して整数-42を取得します。「-42」は[-231、231 -1]の範囲にあるため、最終結果は-42になります。

例3:

入力:s = "4193 with words"出力:4193説明:ステップ1: "4193 with
words"(先頭にスペースがないため、現在文字は読み取られません)
^ステップ2: "4193 with words"(現在の文字は読み取られません) )文字では、「-」または「+」がないため)
^ステップ3:「4193withwords」(「4193」を読み取ります。次の文字が数字ではないため、読み取りは停止します)
^整数4193が解析されます。「4193」は[-231、231-1]の範囲にあるため、最終結果は4193になります。

例4:

入力:s = "words and 987"出力:0説明:ステップ1: "words and
987"(先頭にスペースがないため、現在文字は読み取られません)
^ステップ2: "words and 987"(現在の文字は読み取られません) in)文字、'-'または'+'がないため)
^ステップ3: "words and 987"(現在の文字'w'は数字ではないため、読み取りは停止します)
^読み取りがないため、整数0に解析されます番号。0は[-231、231 -1]の範囲にあるため、最終結果は0になります。

例5:

入力:s = "-91283472332"出力:-2147483648説明:ステップ1
: "-91283472332"(先頭にスペースがないため、現在文字は読み取られません)
^ステップ2: "-91283472332"('-'文字が読み取られます、したがって、結果は負の数になるはずです)
^ステップ3: "-91283472332"( "91283472332"で読み取ります)
^整数-91283472332に解析します。-91283472332は範囲[-231、231 -1]の下限よりも小さいため、最終結果は-231=-2147483648に切り捨てられます。

提示:

0 <= s.length <= 200
s 由英文字母(大写和小写)、数字(0-9)、' ''+''-''.' 组成

ソース:LeetCode
リンク:https ://leetcode-cn.com/problems/string-to-integer-atoi

勉強の時間:

2022.1.12


学習出力:

アイデア1
ここに画像の説明を挿入

問題解決のアイデア
1.まず、この質問はアルゴリズムとはほとんど関係がありません。主にデータの分析と処理の能力を調べます
。2.質問を注意深く読む必要があります。次の状況をリストしました。
<1>スペース+文字+数字
<2>スペース+数字+文字
<3>文字+スペース+数字
<4>スペース+数字+文字
これには「+-」記号
3が散在している可能性があります。明確にする必要があります。最初に削除します。スペースを入れてから、数字の読み取りを開始します。この時点で記号を読み取るのが正常である場合、さらに、いずれかの場合に記号を読み取る場合は、間違った位置にあるため、現在の値を返すだけです
。数字を読むときに最初の文字を読んでから直接戻る数字を読んでから数字の後に文字を読むと、直接戻ることもできます。とにかく、数字ではない数字に出会った場合は、直接に戻り
ます。このとき、数字を読むと、プラス記号とマイナス記号、スペースと文字を読むことができます。終了します。

public class Solution {
    
    
    public int MyAtoi(string s) {
    
    
        int end=0;   //最终返回的值
        int index=0;
        bool isSignal=false;   //是否读到了正负号
        bool isNumber=false;     //是否读到了数字
        bool isBiggerZero=true;   //正负号的取值
        while(index<s.Length){
    
    
            if(s[index]==' '){
    
    
                if(isNumber){
    
       //如果读到了数字,再读到空格,就直接返回
                    return(EndDo());
                }
                if(isSignal){
    
      //如果读到正负号,再读到空格,直接返回
                    return(EndDo());
                }
                index++;
                continue;
            }
            if(s[index]=='+'){
    
    
                if(isNumber){
    
        //如果读到了数字,再读到正负号,直接返回
                    return(EndDo());
                }
                if(isSignal)return 0;   //如果已经读到了正负号,又读到,直接返回
                isBiggerZero=true;
                index++;
                isSignal=true;
                
                continue;
            }
            if(s[index]=='-'){
    
    
                if(isNumber){
    
       //如果读到了数字,再读到正负号,直接返回
                    return(EndDo());
                }
                if(isSignal)return 0; //如果已经读到了正负号,又读到,直接返回
                isBiggerZero=false;
                index++;
                    isSignal=true;
                 
                continue;
            }

            if(s[index]>'9'||s[index]<'0'){
    
    
                //是字符 退出
                return(EndDo());  //如果读到字符,直接退出

            }else{
    
    
                isNumber=true;
                //if(end==0&&s[index]=='0')return 0;
                if (isBiggerZero&&( end > 214748364 || (end == 214748364 && s[index] > '7')))  //这里做是否正越界判断
                {
    
    
                    return 2147483647;
                }
                
                if (!isBiggerZero&&( end > 214748364 || (end == 214748364 && s[index] >'8')))  //这里做是否负越界判断
                {
    
    
                    return -2147483648;
                }
                end*=10;
                end+=s[index]-'0';
            }
            
            index++;
            
        }
        return(EndDo());

        int EndDo(){
    
    
                if(isBiggerZero)return end;
            else return -end;
        }
    }
}

著者:モルモットXiaohuihui
著作権は著者に帰属します。商用の再版については、著者に連絡して許可を求め、非商用の再版については、出典を示してください。

おすすめ

転載: blog.csdn.net/m0_48781656/article/details/122483523