面試題 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;
}