首页 > 其他分享 >Offer68题 Day5

Offer68题 Day5

时间:2024-10-30 23:33:25浏览次数:1  
标签:std int Day5 long Offer68 算法 vector ans

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


标签:std,int,Day5,long,Offer68,算法,vector,ans
From: https://www.cnblogs.com/itsinsane/p/18516758

相关文章

  • Offer68题 Day4
    面试题14-I.剪绳子#include<iostream>#include<vector>usingnamespacestd;classSolution{public: staticintcuttingBamboo(constintbamboo_len){ vector<int>dp(bamboo_len+1,0);//dp数组存放乘积max if(bamboo_len<=1)return0; ......
  • offer68题 Day3
    面试题12.矩阵中的路径#include<iostream>#include<vector>#include<functional>usingnamespacestd;classSolution{public: boolexist(vector<vector<char>>&grid,conststring&target)const { constintm=grid.size(......
  • Offer68题 Day2 树的基础算法
    1.前中后序递归遍历//前序遍历classSolution{public:voidtraversal(TreeNode*cur,vector<int>&vec){if(cur==NULL)return;vec.push_back(cur->val);//中traversal(cur->left,vec);//左traversal(cur-&g......
  • Offer68题 Day3 两个基础算法
    1.DFS深度优先算法/* -深度优先算法 DFS从起始节点出发,沿着一条路径尽可能深入地访问每个节点,直到无法继续时再回退,寻找未访问的节点。 -使用递归实现。*/#include<iostream>#include<vector>usingnamespacestd;voidDFS(intnode,vector<vector<int>>&gra......
  • 算法刷题记录(day5)
    LC160.相交链表题目描述:给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null。classSolution{public:ListNode*getIntersectionNode(ListNode*headA,ListNode*headB){if(head......
  • 【代码随想录Day54】图论Part06
    冗余连接题目链接/文章讲解:代码随想录importjava.util.Scanner;publicclassMain{privateintnumberOfNodes;//节点数量privateint[]parent;//存储每个节点的父节点//构造函数初始化并查集publicMain(intsize){numberOfNod......
  • 【代码随想录Day53】图论Part05
    并查集理论基础题目链接/文章讲解:并查集理论基础|代码随想录寻找存在的路径题目链接/文章讲解:代码随想录importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){intnumberOfElements,numberOfConnections;Scann......
  • 【代码随想录Day52】图论Part04
    字符串接龙题目链接/文章讲解:代码随想录importjava.util.*;publicclassMain{//使用广度优先搜索(BFS)方法计算从beginWord到endWord的最短转换序列长度publicstaticintfindLadderLength(StringbeginWord,StringendWord,List<String>wordList){......
  • offer68题 Day2
    面试题07.重建二叉树前中序构建要根据二叉树的前序遍历和中序遍历结果来构建二叉树,我们可以利用以下性质:前序遍历的第一个元素总是当前树的根节点。中序遍历中,根节点将二叉树分为左子树和右子树。思路根据前序遍历的第一个元素确定根节点。在中序遍历中找到根节点位置......
  • IO进程_day5
    目录线程Thread1.什么是线程1.1概念1.2进程和线程区别1.3线程资源2.函数接口2.1创建线程:pthread_create2.2退出线程:pthread_exit2.3回收线程资源练习:通过父子进程完成对文件的拷贝(cp)练习:输入输出,quit结束3.同步3.1概念3.2同步机制3.3函数接......