在做此类的问题时,要注意一下几点。
注意事项:
数据的类型:正数、负数、小数,0.
数据的正确性:考虑错误输入,错误输入该如何处理
数据最大和最小范围:INT_MAX (2147483647,0x7fffffff);INT_MIN (-2147483648, 0x80000000)
例题:
1. String to Integer (atoi)字符串转为整数
https://blog.csdn.net/tc_1337/article/details/79686337
2. Reverse Integer 翻转一个整数
https://blog.csdn.net/tc_1337/article/details/79679041
3. Power of Two 判断一个int是不是2的幂
boolean isPowerOfTwo(int n)
{
if (n <= 0)
return false;
return (n&(n-1))==0 ? true:false;
}
4. Power of Four 判断一个数是不是4的幂
boolean isPowerOfFour(int num)
{
// 如果num是负数
if (num <= 0)
return false;
// 先判断是否是2的倍数
if ((num & (num-1)) == 0)
{
// 再判断相与结果是否为0
if ((num & 0x55555555) != 0)
{
return true;
}
return false;
}
return false;
}
5. Number of 1 Bits 某一个数中bit1的个数
int numberOf1(int n)
{
int ncount = 0; // 计数器
while (n > 0)
{
n = n & (n-1); // 最低位1置为0
ncount++;
}
return ncount;
}
6. Power of Three 判断一个数是不是3的幂
性质:存在两个整数数是3的幂,则其中较大的数对较小的数取模,结果为0。
boolean isPowerOfThree(int n)
{
final int maxint = 0x7fffffff;
int k = (int) (Math.log(maxint) / Math.log(3));
int bigger3 = (int) Math.pow(3, k);
return (bigger3 % n ==0)? true:false;
}
7. Factorial Trailing Zeros 求n!末尾连续多少个0
num = a * 10^k = a*(5^k * 2^k),也就是说零的个数与2, 5 有关,而5的因子数要小于2,所以,只需要判断包含
因子5的个数即可。
常规思路:
public int trailingZeros1(int n)
{
int ncount = 0; // 计数器
for (int i=5; i<=n; i+=5) // 优化
{
int x = i;
while (x%5==0)
{
ncount++;
x /= 5;
}
}
return ncount;
}
高级方法:
分析:
5 10 15 20 25 30 35 。。。 50 。。。75 n / 5
1 2 3 4 5 6 7。。。 。10 。。。15 n / 25
0 0 0 0 1 0 0 。。。。2。。。。3
public int trailingZero2(int n)
{
int ncount = 0; // 计数器
while (n>0)
{
ncount += n/5;
n /= 5;
}
return ncount;
}
8. 各个数位相加
https://blog.csdn.net/tc_1337/article/details/81349166
9. MissingNumber
https://blog.csdn.net/tc_1337/article/details/81349355
10.素数
https://blog.csdn.net/dinosoft/article/details/5829550
11. Happy Number
https://blog.csdn.net/tc_1337/article/details/81349554