Offer68题 Day5

面试题 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;
}


posted @   itsinsane  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示