x的平方根和位1的个数

73 阅读2分钟

第一题: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;
    }
};

案例都通过了,但是时间有点慢。

image-20230414173054672.png

第二题:位1的个数

编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。

思路:看到这个题,我的第一想法是把二进制数存储到数组中,然后一一判断是否与1相等,写完后才发现,在C++中我并不知道如何转换成数组,后来发现我可以直接取余,然后用位移运算就可以得到1的个数

int hammingWeight(uint32_t n) {
        int count=0;
        while(n)
        {
            count+=n%2;
            n>>=1;
        }
        return count;
    }

(^o^)/YES!,执行时间很完美!

image-20230414175210588.png

后面看了一下评论区,发现竟然有函数可以直接得到

int hammingWeight(uint32_t n) {
        return bitset<32>(n).count();
}

原来是C++标准库bitset函数,意思是把输入n转换为32位长的01比特串,count()是统计比特串中位1的个数。

总结:今天写的两题都是简单题(暂时只会写简单题),感觉要学习的还有很多,算法思维太简单了,平时要多加思考,多总结,之后好好加油。 ps:今天出拟录取通知啦,嘿嘿,磨刀不误砍柴工,读完硕士再打工。继续加油呀!