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

话不多说,上题:

实现 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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲸鲸爱柠檬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值