• leetcode刷题笔记08 字符串转整数 (atoi)


    题目描述

    实现 atoi,将字符串转为整数。

    在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

    字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。

    当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。

    若函数不能执行有效的转换,返回 0。

    说明:

    假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231,  231 − 1]。如果数值超过可表示的范围,则返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。

    示例

    示例1:

    输入: "42"
    输出: 42

    示例2:

    输入: "   -42"
    输出: -42
    解释: 第一个非空白字符为 '-', 它是一个负号。
         我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42

    示例3:

    输入: "4193 with words"
    输出: 4193
    解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。

    示例4:

    输入: "words and 987"
    输出: 0
    解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
         因此无法执行有效的转换。

    示例5:

    输入: "-91283472332"
    输出: -2147483648
    解释: 数字 "-91283472332" 超过 32 位有符号整数范围。 
         因此返回 INT_MIN (−231) 。

    题型分析

    常见算法面试题,题目虽然leetcode难度标签为中等,好像通过率也不怎么高,14%左右,此题在做的过程中需注意以下几点

    1、负数前的‘-’号、正数前的‘+’号

    2、错误输入,如在开始输入多个空格,或者数字后加字母的情况 如:898word

    3、考虑数值溢出问题、max_int=0x7fffffff  min_int=0x80000000

    解答代码

    C++版:

    class Solution {
    public:
        int myAtoi(string str) {
            const int maxint=0x7fffffff;
            const int minint=0x80000000;
            const long long max=0x100000000;
            long long ans=0;
            bool flag=false;
            int st=0;
            while(st<str.length()&&str[st]==' '){
                st++;
            }
            if(st<str.length()&&str[st]=='+'){
                st++;
            }else{
                if(st<str.length()&&str[st]=='-'){
                    flag=true;
                    st++;
                }
            }
            for(int i=st;i<str.length();i++){
                if(str[i]<='9'&&str[i]>='0'){
                    ans=ans*10+str[i]-'0';
                    if(ans>maxint) ans=max;
                }else{
                    break;
                }
            }
            if(flag) ans=-ans;
            if(ans>maxint) ans=maxint;
            if(ans<minint) ans=minint;
            
            return ans;
            
        }
    };
    code

     Python版:

    class Solution:
        def myAtoi(self, str):
            """
            :type str: str
            :rtype: int
            """
            maxint=0x7fffffff
            minint=0x80000000
            max=0x80000000
            ans=0
            flag=False
            st=0
            while(st<len(str) and str[st]==' '):
                st+=1
            if (st<len(str) and str[st]=='+'):
                st+=1
            else:
                if st<len(str) and str[st]=='-':
                    flag=True
                    st+=1
            for i in range(st,len(str)):
                try:
                    if int(str[i])<=9 and int(str[i])>=0:
                        ans=ans*10+int(str[i])
    
                        if ans>maxint:
                            ans=max
    
    
                except ValueError:
                    break
    
            if flag:
                ans=-ans
                if ans < -minint:
                    ans = -minint
            if ans>maxint:
                ans=maxint
            return ans
    Code
  • 相关阅读:
    leetcode 850. Rectangle Area II
    leetcode 699. Falling Squares 线段树的实现
    leetcode 847. Shortest Path Visiting All Nodes 无向连通图遍历最短路径
    leetcode 843. Guess the Word
    javaMail实现收发邮件(三)
    javaMail实现收发邮件(二)
    javaMail实现收发邮件(一)
    springboot整合websocket实现一对一消息推送和广播消息推送
    jieba分词/jieba-analysis(java版)
    java实现两个不同list对象合并后并排序
  • 原文地址:https://www.cnblogs.com/qflyue/p/8971863.html
Copyright © 2020-2023  润新知