微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

话不多说,上题:

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

原文地址:https://www.jb51.cc/wenti/3284464.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐