搬砖小技巧|好题分享第二弹

话不多说,上题:

实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,x^n

 C++ 里面有自带函数pow(x,n)可以实现,我们来复现一下这个代码

最自然的是写一个for循环,但肯定非常费时间。我先用了快速幂的方法实现:

 double myPow(double x, int n) {
        if(n==0 || x==1) return 1.00000;
        if(x==0) return 0.00000;
        if(n<0)
        {
            n = -n;
            x = 1.0/x;
        }
        double result = 1;
        while(n>0)
        {
            double temp = x;
            int t = 1;
            while(t+t<=n)
            {
                temp *= temp;
                t = t + t;
            }
            n -= t;
            result *= temp;
        }
        return result;
    }

每次都自己乘自己,很快获得2,4,8,16……次幂。比如需要获得20次幂,先快速获得16次幂,剩下4次再做一次循环。

但这样的速度仍然不是特别快,参考评论区,写了如下代码,速度更快:

double myPow(double x, int n) {
        if(x == 1 || n == 0) return 1.00000;
        if(n%2==0) return myPow(x*x, n/2);
        else return (n>0 ? x : 1.0/x) * myPow(x*x, n/2);  
}

递归思想的代码总是很简洁~

再推荐一道题目不难,但思路不容易想的题目:

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,从matrix[0][0]开始,返回矩阵中的所有元素。

比较麻烦的地方在于如何处理边界,也就是怎么让程序知道该转弯了,又该怎么转。

先上代码

vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> res;
        if(matrix.size()==0) return res;
        int up = 0, down = matrix.size(), left = 0, right = matrix[0].size();
        while(true)
        {
            for(int i=left;i<right;i++) res.push_back(matrix[up][i]);
            if(++up > down-1) break;
            for(int i=up;i<down;i++) res.push_back(matrix[i][right-1]);
            if(--right < left+1) break;
            for(int i=right-1;i>=left;i--) res.push_back(matrix[down-1][i]);
            if(--down < up+1) break;
            for(int i=down-1;i>=up;i--) res.push_back(matrix[i][left]);
            if(++left > right-1) break;
        }
        return res;
    }

解释:现根据矩阵的大小确定初始边界,再按照左->右,上->下,右->左,下->上的顺序走完一圈。每一条边遍历完之后,更新边界并判断是否已达到停止条件,一旦达到,就推退出

据说这是好几年前的考研真题,如果在考场上第一次碰到这种题,还是蛮搞心态的QAQ

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...
win11本地账户怎么改名?win11很多操作都变了样,用户如果想要...