第一题: 整数反转
题目描述:
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
边界提示:
测试用例:
这个题目很吉尔简单,但是也有需要注意的技巧,比如说,判断回文数,在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;
完整代码
classSolution{
public:
intreverse(intx) {
longn=0;
while(x)
{
n=n*10+x%10;
x=x/10;
}
returnn>INT_MAX||n<INT_MIN?0:n;
}
};
记得在leetcode里运行。
这个典型的模拟匹配题,我们在这里先看看题。
题目描述:
请你来实现一个 atoi 函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:
如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0 。
注意:
本题中的空白字符只包括空格字符 ' ' 。假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 231 − 1 或 −231 。
吐槽(这么一大堆字我服了)
整理一下我们先直接看测试用例
测试用例
我们采用状态机的方式来解决该问题,我们把数字分解为 “符号”
“数字”
分别用state来表示‘’符号‘’ state==1 为正整数 state==-1为负整数
最后返回 return state*res;即可
没有啥好说的,注释给你写的清清楚楚(可怜可怜我给我点赞吧)
classSolution{
public:
intmyAtoi(strings) {
longlongres=0;//long long 型的结果
intstate=0;// 1标识正数,-1标识负数。
cout<<s<<endl;
intss=sizeof(s);//取长度
for(inti=0;i<ss;i++)//循环
{
if(s[i]==' ')//如果为‘ ’则继续
continue;
elseif(s[i]=='+')//更新state状态1标识正数,-1标识负数。
state=1;
elseif(s[i]=='-')//更新state状态1标识正数,-1标识负数。
state=-1;
elseif(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)
{
returnINT_MIN;
}
else
{
returnINT_MAX;
}
}
if(state==0)//如果最后状态机还没有更新,就赋给正数
{
state=1;
}
returnstate*res;
}
};
第三题回文数
回文数判断,看看第一题hhh,正好把数倒装过来判断一下是不是和原数相等,自然知道是不是回文数。
直接上代码
classSolution{
public:
boolisPalindrome(intx) {
//和第一题一模一样,注释也一样
longn=0;
longor_x=x;
if(x<0)
{
returnfalse;
}
while(x)
{
n=n*10+x%10;
x=x/10;
}
if(n==or_x)
{
returntrue;
}
else
{
returnfalse;
}
}
};