Datawhale-leetcode第二天打卡(leetcode保姆级教程)——题号007,008,009

Datawhale-leetcode第二天打卡(leetcode保姆级教程)——题号007,008,009

今天是打卡的第二天,我们废话少说,直接看题。

第一题: 整数反转

题目描述:

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

边界提示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wXyknPwV-1610457878726)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210112205542244.png)]

测试用例:

在这里插入图片描述

这个题目很吉尔简单,但是也有需要注意的技巧,比如说,判断回文数,在c语言老师(冯程(地质老师))教学的时候,其实很多有时候有提到,多位数的分解,取出不同的位数。

我们可以先对这个数进行取余后,再进行位移操作。

为了完成这个操作我们直接上代码

下面是代码加注释

        long n=0;
        while(x)//循环不解释了
        {
            n=n*10+x%10;//每次取最后一位(取余)
            x=x/10;//位移
        }

然后注意边界条件

如果溢出int就返回0

 return n > INT_MAX || n < INT_MIN ? 0:n;

完整代码

class Solution {
public:
    int reverse(int x) {
        long n=0;
        while(x)
        {
            n=n*10+x%10;
            x=x/10;
        }
        return n > INT_MAX || n < INT_MIN ? 0:n;
    }
};

记得在leetcode里运行。

第二题8. 字符串转换整数 (atoi)

这个典型的模拟匹配题,我们在这里先看看题。

题目描述:

请你来实现一个 atoi 函数,使其能将字符串转换成整数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:

如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。
假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。
假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0 。

注意:

本题中的空白字符只包括空格字符 ’ ’ 。
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 231 − 1 或 −231 。

吐槽(这么一大堆字我服了)

整理一下我们先直接看测试用例

测试用例

我们采用状态机的方式来解决该问题,我们把数字分解为 “符号”

“数字”

分别用state来表示‘’符号‘’ state1 为正整数 state-1为负整数

最后返回 return state*res;即可

没有啥好说的,注释给你写的清清楚楚(可怜可怜我给我点赞吧)

class Solution {
public:
    int myAtoi(string s) {
        long long res=0; //long long 型的结果
        int state=0;// 1标识正数,-1标识负数。
        cout<<s<<endl;
        int ss=sizeof(s); //取长度
        for(int i=0;i<ss;i++) //循环
        {
            if(s[i]==' ') //如果为‘ ’则继续
            continue;
            else if(s[i]=='+')//更新state状态1标识正数,-1标识负数。
            state=1;
            else if(s[i]=='-')//更新state状态1标识正数,-1标识负数。
            state=-1;
            else if(s[i]>='0'&&s[i]<='9') //记录数值
            res=res*10+(int(s[i])-int('0')); //正向取值
            else//奇奇怪怪的符号就break吧
            {
            break;
            }
        }
        if(res<INT_MIN||res>INT_MAX)//溢出返回最大值或者最小值
        {
            if(res<0)
            {
                return INT_MIN;
            }
            else
            {
                return INT_MAX;
            }
        }
        if(state==0)//如果最后状态机还没有更新,就赋给正数
        {
            state=1;
        }
        return state*res;
    }
};

第三题回文数

回文数判断,看看第一题hhh,正好把数倒装过来判断一下是不是和原数相等,自然知道是不是回文数。

直接上代码

class Solution {
public:
    bool isPalindrome(int x) {
    //和第一题一模一样,注释也一样
        long n=0;
        long or_x=x;
        if(x<0)
        {
            return false;
        }
        while(x)
        {
            n=n*10+x%10;
            x=x/10;
        }
        if(n==or_x)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
};

解决任务!(想念世界上最可爱的CC)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值