第一题:X的平方根
题目:给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
思路:一开始看到这个题目我的想法是,‘这不就是个小学数学题吗,看我两下给他写出来’,然后就有了第一版的代码。
不能用代码自带的函数,那就暴力破解,平方和就是相同的数乘积。既然只取整数,有省略在里面,那就某个数乘自己小于等于X,某个数加1乘自己大于X的夹逼得到结果,具体代码如下:
class Solution {
public:
int mySqrt(int x) {
int i =0;
if(x >=0){
for(i = 0;i <= x;i++){
if(i * i <= x && (i+1)*(i+1) > x) break;
}
}
return i;
}
};
但是到我测试的时候发现,我根本没有考虑到溢出的问题,int类型取值范围为-32768~32767,当输入的X是一个特别大的数就会溢出,所以不能用乘法。
所以,用除法即可,于是有了第二版代码。
直接用X除i(i每次递增),当x/i<i时跳出while循环,输出i-1即可,因为while不满足时,i已经大了。
其实这个答案是在同学的提醒下做出来的,之前还走了一点弯路。听说这时微软面试的第一题,写出来还是需要点技巧性在里面的。
class Solution {
public:
int mySqrt(int x) {
int i = 1;
while(x / i >=i) i++;
return i-1;
}
};
案例都通过了,但是时间有点慢。
第二题:位1的个数
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。
思路:看到这个题,我的第一想法是把二进制数存储到数组中,然后一一判断是否与1相等,写完后才发现,在C++中我并不知道如何转换成数组,后来发现我可以直接取余,然后用位移运算就可以得到1的个数
int hammingWeight(uint32_t n) {
int count=0;
while(n)
{
count+=n%2;
n>>=1;
}
return count;
}
(^o^)/YES!,执行时间很完美!
后面看了一下评论区,发现竟然有函数可以直接得到
int hammingWeight(uint32_t n) {
return bitset<32>(n).count();
}
原来是C++标准库bitset函数,意思是把输入n转换为32位长的01比特串,count()是统计比特串中位1的个数。
总结:今天写的两题都是简单题(暂时只会写简单题),感觉要学习的还有很多,算法思维太简单了,平时要多加思考,多总结,之后好好加油。 ps:今天出拟录取通知啦,嘿嘿,磨刀不误砍柴工,读完硕士再打工。继续加油呀!