7. 整数反转
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
class Solution {
public:
int reverse(int x) {
double c;
int y=0;
do
{
if(y>(pow(2,31)-1)/10||y<-1*pow(2,31)/10)
return 0;
y=y*10+x%10;
x=x/10;
}while(x);
return y;
}
};
个人总结: 虽然简单,但是也有小细节,当乘10溢出时,可以反过来用除10判断。
233. 数字 1 的个数
给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。
示例 1:
输入:n = 13
输出:6
示例 2:
输入:n = 0
输出:0
递归思路
假设数为426,最高位为4(>1),四个100里有的1为pow(10,2)+4pow(10,2-1)2,除去最高位,递归计算低位数。若最高位<=
1,则返回n-xpow(10,c)+1+countDigitOne(xpow(10,c)-1)+countDigitOne(n-xpow(10,c));假设为123
n-xpow(10,c)+1是最高位为1则有23+1(100是多出来的1)个1,countDigitOne(xpow(10,c)-1)返回99的1,countDigitOne(n-xpow(10,c))为23的1。这边的23和99不是23包含在99里了。因为这个函数是运行一次去掉最高位,然后递归。所以当我们算百位为1时,23个三位数都有一个1,但这个时候我们不能直接去掉最高位1,因为百以内的还没处理,所以要加一个countDigitOne(xpow(10,c)-1)算百以内的,再去掉最高位加countDigitOne(n-xpow(10,c))。
class Solution {
public:
int countDigitOne(int n) {
int x=n,c=0;
while(x/10)//x为最高位
{
x=x/10;
c++;//c为最高位在第几位
}
if(x>1)
{
if(c==0)
return 1;
else
return pow(10,c)+x*pow(10,c-1)*c+countDigitOne(n-x*pow(10,c));
}else
{
if(x==1&&c==0)
return 1;
else if(x==0)
return 0;
else
{
return n-x*pow(10,c)+1+countDigitOne(x*pow(10,c)-1)+countDigitOne(n-x*pow(10,c));
}
}
}
};
个人总结: 完全是自己打草稿,根据规律凑出递归来了。感觉思路还是不够清晰,也不熟练,要多练习。