Offer68題 Day5

itsinsane發表於2024-10-30

面試題 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)


快速冪演算法(也稱為指數快速計算或二分冪演算法)是一種高效計算大整數冪的方法。它利用了冪的性質,可以在對數時間複雜度內計算冪,從而顯著減少計算時間。以下是快速冪演算法的基本原理和實現細節。

演算法原理

快速冪演算法基於以下的數學性質:

  1. 冪的拆分
    tes

  2. 遞迴或迭代

    • 透過將冪的計算拆分為較小的冪的計算,快速冪演算法可以遞迴或迭代地計算結果。
    • 在遞迴中,每次將n減半,從而快速達到基例。
    • 在迭代中,透過迴圈將冪逐步減小,也可以達到同樣的效果。

演算法步驟

  1. 初始化結果1,用於儲存最終結果。
  2. 迴圈或遞迴
    • 當指數 ( n ) 不為零時,檢查 ( n ) 的奇偶性:
      • 如果 ( n ) 是奇數,將當前的底數 ( x ) 乘到結果中,並將 ( n 減 1)。
      • 將底數 ( x ) 進行平方,並將 ( n ) 除以 2。
  3. 返回結果,最終結果為 ( 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;
}


相關文章