剑指 Offer(第 2 版) 出现频率从高到低 已经完结100题

upd:12.10,陆陆续续刷了3周刷完了。比较简单 下面开始刷公司题库。

目录

直接A的题目:

剑指 Offer 03. 数组中重复的数字

剑指 Offer 09. 用两个栈实现队列

剑指 Offer 42. 连续子数组的最大和

剑指 Offer 51. 数组中的逆序对

剑指 Offer 45. 把数组排成最小的数

剑指 Offer 25. 合并两个排序的链表

剑指 Offer 22. 链表中倒数第k个节点

剑指 Offer 52. 两个链表的第一个公共节点

剑指 Offer 05. 替换空格

剑指 Offer 12. 矩阵中的路径

剑指 Offer 50. 第一个只出现一次的字符

剑指 Offer 57 - II. 和为s的连续正数序列

剑指 Offer 10- I. 斐波那契数列

剑指 Offer 63. 股票的最大利润

剑指 Offer 34. 二叉树中和为某一值的路径

剑指 Offer 55 - I. 二叉树的深度

 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

剑指 Offer 47. 礼物的最大价值

剑指 Offer 26. 树的子结构

剑指 Offer 39. 数组中出现次数超过一半的数字

剑指 Offer 31. 栈的压入、弹出序列

剑指 Offer 68 - I. 二叉搜索树的最近公共祖先

剑指 Offer 15. 二进制中1的个数

剑指 Offer 32 - II. 从上到下打印二叉树 II

剑指 Offer 59 - II. 队列的最大值

剑指 Offer 16. 数值的整数次方

剑指 Offer 53 - I. 在排序数组中查找数字 I

剑指 Offer 17. 打印从1到最大的n位数

未能直接A的题目

剑指 Offer 48. 最长不含重复字符的子字符串

剑指 Offer 13. 机器人的运动范围


 


以后未直接A的题目每题单独写一篇BLOG——  方便回顾(方便水博客)


直接A的题目:

剑指 Offer 03. 数组中重复的数字

遍历+mp

class Solution {
public:
    int mp[100007];
    int findRepeatNumber(vector<int>& nums) {
        for(auto x:nums){
            mp[x]++;
            if(mp[x]>1)return x;
        }
        return nums[0];
    }
};

剑指 Offer 09. 用两个栈实现队列

栈a、b。

a中的栈倒入b中后,先入后出就变成了先入先出。

所以每次入队列只需要入a中,出队列时,先把b栈推完,若b为空,则执行一次把a推到b的操作。

 

class CQueue {
public:
    stack<int>a,b;
    CQueue() {
        while(!a.empty())a.pop();
        while(!b.empty())b.pop();
    }
    
    void appendTail(int value) {
        a.push(value);
    }
    
    int deleteHead() {
        if(a.empty() && b.empty())
            return -1;
        if(b.empty()){
            while(!a.empty()){
                b.push(a.top());
                a.pop();
            }
        }
        int tmp=b.top();
        b.pop();
        return tmp;
    }
};

/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue* obj = new CQueue();
 * obj->appendTail(value);
 * int param_2 = obj->deleteHead();
 */

剑指 Offer 42. 连续子数组的最大和

简单线性dp,dp[i]:以i结尾,连续子数组的最大和。

转移比较显然。然后优化一维数组就变成了如下代码。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n=nums.size(),mx=nums[0],tp=nums[0];
        for(int i=1;i<n;i++){
            tp=max(tp+nums[i],nums[i]);
            mx=max(tp,mx);
        }
        return mx;
    }
};
/*
class Solution {
public:
    int dp[100007];
    int maxSubArray(vector<int>& nums) {
        int n=nums.size(),mx=nums[0];
        memset(dp,0,sizeof(dp));
        dp[0]=nums[0];
        for(int i=1;i<n;i++){
            dp[i]=max(dp[i-1]+nums[i],nums[i]);
            mx=max(mx,dp[i]);
        }
        return mx;
    }
};
*/

剑指 Offer 51. 数组中的逆序对

树状数组+离散化搞一下逆序对即可(ACM入门题目竟然是hard难度)

class Solution {
public:
    int c[100007],n;
    void add(int x,int d){
        while(x<=n){
            c[x]+=d;
            x+=x&(-x);
        }
    }
    int qu(int x){
        int ans=0;
        while(x){
            ans+=c[x];
            x-=x&(-x);
        }
        return ans;
    }
    int li[100007];
    int reversePairs(vector<int>& nums) {
        int sz=nums.size();
        for(int i=0;i<sz;i++)
            li[i+1]=nums[i];
        sort(li+1,li+1+sz);
        n=unique(li+1,li+1+sz)-(li+1);
        int ans=0;
        memset(c,0,sizeof(c));
        for(int i=sz-1;i>=0;i--){
            int val=lower_bound(li+1,li+1+n,nums[i])-li;
            ans+=qu(val-1);
            add(val,1);
        }
        return ans;
    }
};

剑指 Offer 45. 把数组排成最小的数

最优情况是:交换任意相邻两数都会使得结果变小。

我们直接排序时按照这个规则进行快排即可。

 

struct node{
        int num,len;
    }p[110];
bool cmp(node a,node b){
    return (long long)a.num*pow(10,b.len) + b.num<(long long)b.num*pow(10,a.len) + a.num;
}
class Solution {
public:
    string minNumber(vector<int>& nums) {
        int n=nums.size();
        for(int i=0;i<n;i++){
            int tp=nums[i],len=0;
            while(tp){
                len++;
                tp/=10;
            }
            p[i]=node{nums[i],max(1,len)};
        }    
        sort(p,p+n,cmp);
        string ans;
        for(int i=0;i<n;i++)
            ans+=to_string(p[i].num);
        return ans;
    }
};

剑指 Offer 25. 合并两个排序的链表

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode* ans = new ListNode(0);
        ListNode* pr = ans;
        while(l1||l2){
            if(l2==NULL||(l1!=NULL && l1->val < l2->val)){
                ans->next=l1;
                l1=l1->next;
            }else{
                ans->next=l2;
                l2=l2->next;
            }
            ans=ans->next;
        }
        return pr->next;
    }
};

剑指 Offer 22. 链表中倒数第k个节点

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* getKthFromEnd(ListNode* head, int k) {
        int num = 0;
        ListNode *tp=head;
        while(head){
            head=head->next;
            num++;
        }
        num-=k;
        while(num){
            tp=tp->next;
            num--;
        }
        return tp;
    }
};

 

剑指 Offer 52. 两个链表的第一个公共节点

直接模拟即可

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        int na=0,nb=0;
        ListNode *ta=headA;
        ListNode *tb=headB;
        while(ta){
            ta=ta->next;
            na&
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值