Leetcode8。文字列の整数変換

タイトル説明

実装に来てくださいatoi、それは文字列を整数に変換することができ、機能を。

まず、空白文字で始まります関数は、これまでの最初の非空白文字を見つけるまで、必要であれば無用捨てます。次のように次の変換ルールは以下のとおりです。

  • 最初の文字が非ヌルの正または負の数であれば、多くの連続した数字を組み合わせたようにバックの符号付き整数を形成します。
  • 最初の非空白文字は、連続的な数字を整数を形成するために結合された後、直接である数、である場合。
  • 文字列はまた、効果的な余分な文字の整数部分の後に存在していてもよく、これらの文字は無視することができ、彼らは機能に影響はありません。

:最初の非空白文字が有効な整数の文字列でない文字列が空であるかだけ空白文字列が含まれている場合、この関数は変換が効果的でないことを変換する必要はありません。

いずれにしても、機能が効果的に変換できない場合は、0が返されます。

ヒント:

  • 唯一の空白文字を含む空白文字のタイトル' '
  • 我々は、環境が32ビット符号付き整数のサイズは、数値範囲[-231 231--1]を格納することができると仮定する。またはINT_MIN(-231) - 値がこの範囲を超える場合、INT_MAX(1 231)を返します。

例1:

入力: "42"
出力:42

例2:

入力:「-42」
出力:-42
解説:最初の非空白文字「 - 」、それは負の符号です。
  我々は、すべてのデジタル連続で負の数と、後できるだけ合わせ、最終的には-42を取得します。

例3:

入力:「言葉と987」
出力:0
説明:「W」最初の非空白文字が、それは正の数または負の数ではありません。
したがって、変換を効果的に行うことができません。

例4:

入力:「-91283472332」
出力:-2147483648
説明:番号「-91283472332」32ビット符号付き整数の範囲を超えます。
  だから、INT_MIN(-231)を返します。

説明:

問題の解決策

私はJiaosha、アクトIIバーの法律を知りません。

方法(ジャワ)

アイデア:ステップバイステップ、スペースを削除するための要求の対象に応じて、その後、シンボルが決定され、最終的に処理がデジタルです。、より多くの難治決定された境界値の最も厄介な部分。最大値を超えない場合には、それがあるか否か範囲外で決定されることを確実にするために、ビッグブラザーの練習、一方側への操作と呼ぶことができます。
ヒント:できるだけ多くの運搬方法、Character.isDigit(チャーc)としては、数値文字cかどうかを決定します。末尾のスペース文字列の文字列を削除するStr.trim又は直接被験体に()。


public class Solution {
    public int myAtoi(String str) {
        char[] chars = str.toCharArray();
        int n = chars.length;
        int idx = 0;
        while (idx < n && chars[idx] == ' ') {
            // 去掉前导空格
            idx++;
        }
        if (idx == n) {
            //去掉前导空格以后到了末尾了
            return 0;
        }
        boolean negative = false;
        if (chars[idx] == '-') {
            //遇到负号
            negative = true;
            idx++;
        } else if (chars[idx] == '+') {
            // 遇到正号
            idx++;
        } else if (!Character.isDigit(chars[idx])) {
            // 其他符号
            return 0;
        }
        int ans = 0;
        while (idx < n && Character.isDigit(chars[idx])) {
            int digit = chars[idx] - '0';
            if (ans > (Integer.MAX_VALUE - digit) / 10) {
                // 本来应该是 ans * 10 + digit > Integer.MAX_VALUE
                // 但是 *10 和 + digit 都有可能越界,所有都移动到右边去就可以了。
                return negative? Integer.MIN_VALUE : Integer.MAX_VALUE;
            }
            ans = ans * 10 + digit;
            idx++;
        }
        return negative? -ans : ans;
    }
}

複雑性分析

  • 時間計算: ザ・ N O(N)
  • 宇宙の複雑さ: ザ・ 1 ) O(1)

方法II(javaの)

アイデアは:実際には、同様のアイデアが、今回は、少し速く10によるかどうかをnum増加に注意を払うことや、私たちは、2つの範囲外であるかどうかを判断する必要があるので、範囲外である可能性が高いでしょう。


class Solution {
    public int myAtoi(String str) {
        //去掉str首尾的空格
        str = str.trim();
        if (str.length() == 0) {
            return 0;
        }
        char[] chars = str.toCharArray();
        int min = -2147483648;
        int max = 2147483647;
        int flag = 0;
        int sum = 0;
        
        if ((int) chars[0] == 45) {
            flag = 1;
        } else if ((int) chars[0] == 43) {
            flag = 0;
        } else if ((int) chars[0] < 48 || (int) chars[0] > 57) {
            return 0;
        } else {
            sum = (int) chars[0] - (int) ('0');
        }
        for (int i = 1; i < chars.length; i++) {
            if ((int) chars[i] < 48 || (int) chars[i] > 57) {
                break;
            }
            int num = (int) chars[i] - (int) ('0');
            if (flag == 0 && sum > max / 10) {
                return max;
            }
            if (flag == 1 && -sum < min / 10) {
                return min;
            }
            sum = sum * 10;
            if (flag == 0 && sum > max - num) {
                return max;
            }
            if (flag == 1 && -sum < min + num) {
                return min;
            }
            sum = sum + num;
        }
        if (flag == 1) {
            return -sum;
        }
        return sum;
    }
}

複雑性分析

  • 時間計算: O ( N ) O(N)
  • 宇宙の複雑さ: O ( 1 ) O(1)

2020年4月3日

公開された43元の記事 ウォン称賛20 ビュー1437

おすすめ

転載: blog.csdn.net/Chen_2018k/article/details/105304192