剑指Offer(第二版)题目总结

数据结构

数组

数组中重复的数字

找出数组中重复的数字。

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1
的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

解题思路:
哈希表(看到还有原地算法不过还不会)
哈希表的建立 unordered_map<type,type> name;
代码:

int findRepeatNumber(vector<int>& nums) {
	unordered_map<int, bool> mymap; //建立哈希表 key int value bool
    for(int i:nums){ //遍历
    	if(mymap[i])
        	return i; //如果哈希表中有该元素对应的value为true 就返回该key
         mymap[i]=true;	//没有的话将其添加进入哈希表中
    }
    return -1; //不重复返回呗
}

二维数组中的查找

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

解题思路:
由于该二维数组的排列每一行都是按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序,所以可以从右上角开始,如果比右上角的数大的话就去除该数所在的行,如果比它小的话就去除该数所在的列。(从左下角开始同理)
代码:

//以右下角开始为例来看
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
	if(matrix.size()==0)
        return false;
    int i=matrix.size()-1;
    int j=0;
    while(i>=0&&j<matrix[0].size()){
        if(target==matrix[i][j])
            return true; //相等,说明找到了
        else if(target>matrix[i][j])
            j++; //比target大的话就不看该数所在的列了
        else
            i--; //比target小的话就不看该数所在的行了
    }
    return false; //没找到呗
}

字符串

替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
解题思路:so easy~
代码:

string replaceSpace(string s) {
    string res="";
    for(auto i:s){
        if(i==' ')
            res+="%20";
        else
            res+=i;
    }
    return res;
}

链表

从头到尾打印链表

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
解题思路:
方法一 菜鸟的常规思路 先保存再倒置
方法二 栈 入栈出栈从头到尾
其它递归等…
代码:

//方法一
vector<int> reversePrint(ListNode* head) {
    vector<int> res;
    while(head!=nullptr){
        res.push_back(head->val);
        head=head->next;
    }
    reverse(res.begin(),res.end());
    return res;
}
//方法二
vector<int> reversePrint(ListNode* head) {
    stack<int> stack1;
    while(head!=nullptr){
        stack1.push(head->val);
        head=head->next;
    }
    //这里必须用一个变量来表示栈的大小
    //因为后续for循环中会有入栈出栈操作 栈的大小会发生改变 产生差错
    int size=stack1.size();
    vector<int> res;
    for(int i=0;i<size;i++){
        res.push_back(stack1.top());
        stack1.pop();
    }
    return res;
}

重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
解题思路:

代码:

二叉树的下一个节点

栈和队列

用两个栈实现队列

算法和数据操作

递归和循环

斐波那契数列

青蛙跳台阶问题

查找和排序

旋转数组的最小数字

回溯法

矩阵中的路径

机器人的运动范围

动态规划与贪婪算法

剪绳子

位运算

二进制中1的个数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值