面试题 16. 数值的整数次方
class Solution {
public:
double myPow(double x, int n) {
// 快速幂算法通过将底数平方和指数减半的方式,减少了计算时间,从而将复杂度降低到 O(logn)
// 最小的负数的绝对值 比 最大的正数 更大,所以用long存储n
long p=static_cast<long>(n);
if(n<0){ // 指数是负数时,处理负数
x=1/x; // 取到数
p=-p; // 负数变正数
}
double result=1.0;
while(p>0){
if(p%2==1){ // n是奇数
result*=x;
}
x=x*x;
p=p/2;
}
return result;
}
};
// 时间o(logn),空间o(1)
快速幂算法(也称为指数快速计算或二分幂算法)是一种高效计算大整数幂的方法。它利用了幂的性质,可以在对数时间复杂度内计算幂,从而显著减少计算时间。以下是快速幂算法的基本原理和实现细节。
算法原理
快速幂算法基于以下的数学性质:
-
幂的拆分:
-
递归或迭代:
- 通过将幂的计算拆分为较小的幂的计算,快速幂算法可以递归或迭代地计算结果。
- 在递归中,每次将n减半,从而快速达到基例。
- 在迭代中,通过循环将幂逐步减小,也可以达到同样的效果。
算法步骤
- 初始化结果为
1
,用于存储最终结果。 - 循环或递归:
- 当指数 ( n ) 不为零时,检查 ( n ) 的奇偶性:
- 如果 ( n ) 是奇数,将当前的底数 ( x ) 乘到结果中,并将 ( n 减 1)。
- 将底数 ( x ) 进行平方,并将 ( n ) 除以 2。
- 当指数 ( n ) 不为零时,检查 ( n ) 的奇偶性:
- 返回结果,最终结果为 ( x ) 的 ( n ) 次幂。
面试题 17. 打印从 1 到最大的 n 位数
// 不考虑大数溢出
class Solution {
public:
vector<int> countNumbers(int cnt) {
int n=pow(10,cnt)-1;
vector<int> ans;
for(int i=1;i<=n;i++){
ans.push_back(i);
}
return ans;
}
};
// 考虑大数溢出,使用字符串模拟
#include <iostream>
#include <vector>
#include <string>
#include <functional>
class Solution {
public:
// 返回从 1 到最大的 n 位十进制数
std::vector<int> printNumbers(int n) {
long long maxNum = pow(10, n) - 1; // 使用 long long 来避免溢出
std::vector<int> ans;
for (long long i = 1; i <= maxNum; ++i) {
ans.push_back(i);
}
return ans;
}
// 返回从 1 到最大的 n 位十进制数(字符串形式)
std::vector<std::string> print(int n) {
std::vector<std::string> ans;
std::string s;
std::function<void(int, int)> dfs = [&](int i, int j) {
if (i == j) {
ans.push_back(s);
return;
}
int k = i ? 0 : 1; // 首位不能为 0
for (; k < 10; ++k) {
s.push_back(k + '0'); // 将数字转换为字符并添加到字符串中
dfs(i + 1, j);
s.pop_back(); // 回溯,移除最后一个字符
}
};
for (int i = 1; i <= n; ++i) {
dfs(0, i);
}
return ans;
}
};
int main() {
Solution solution;
int n = 3; // 示例输入
std::vector<int> numbers = solution.printNumbers(n);
// 输出结果
for (int num : numbers) {
std::cout << num << " ";
}
std::cout << std::endl;
// 测试 print 方法
std::vector<std::string> strings = solution.print(n);
for (const auto& str : strings) {
std::cout << str << " ";
}
std::cout << std::endl;
return 0;
}
标签:std,int,Day5,long,Offer68,算法,vector,ans
From: https://www.cnblogs.com/itsinsane/p/18516758