持续更新学习中
数据结构
数组
数组中重复的数字
找出数组中重复的数字。
在一个长度为 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;
}
树
重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
解题思路:
代码: