话不多说,上题:
实现 pow(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