01 二维数组中的查找
题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例1
输入:
7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值:
true
思路:
由于数组从左到右递增,从上到下递增,那么从右上角开始看,设有x行y列
若target比a[0,y]大,则target在a[0,y]下方
若target比a[0,y]小,则target在a[0,y]左方
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
if(array.size()==0||array[0].size()==0)return false;
int x=0;
int y=array[0].size()-1;
bool ans=false;
while(x<array.size()&&y>=0){
if(array[x][y]==target){
ans=true;
break;
}
if(array[x][y]>target){
y--;
}
else{
x++;
}
}
return ans;
}
};
02 替换空格
题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路:
创建一个新的字符串,遍历给出的字符串,遇到空格时新字符串加“%20”,若不是空格则加上对应的字符
ps:题目给出的函数返回值为void,所以要利用strcpy函数将新字符复制到老字符串的地址空间下
class Solution {
public:
void replaceSpace(char *str,int length) {
string s=str;
string ans;
for(char c:s){
if(c==' ')ans+="%20";
else ans+=c;
}
strcpy(str, ans.c_str());
}
};
03 从尾到头打印链表
题目描述
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
示例1
输入:
{67,0,24,58}
返回值:
[58,24,0,67]
思路:
利用递归,遍历链表,自底向上保存在容器中
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> ans;
if(!head)return ans;
ans=printListFromTailToHead(head->next);
ans.push_back(head->val);
return ans;
}
};
04 重建二叉树
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
示例1
输入:
[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]
返回值:
{1,2,5,3,4,6,7}
思路:
前序遍历二叉树的顺序是根左右,中序遍历二叉树的顺序是左根右
前序遍历数组中第一个节点为根节点,找出中序遍历数组中根节点的位置n
两个数组n+1往后都是右子树的节点
利用递归的思想,先建好左右子树,最后合成二叉树
递归出口为最后剩下一个元素则返回
遇到的问题
c++中copy函数返回值是迭代器,不是容器,需要自己写一个函数完成数组的复制
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> vin) {
if (pre.size() == 0)return nullptr;
if (pre.size() == 1) {
return new TreeNode(pre[0]);
}
TreeNode* root = new TreeNode(pre[0]);
int rootindex = 0;
for (int i = 0; i < vin.size(); i++) {
if (pre[0] == vin[i]) {
rootindex = i;
break;
}
}
root->left = reConstructBinaryTree(mycopy(1, rootindex+1, pre),
mycopy(0, rootindex , vin));
root->right = reConstructBinaryTree(mycopy(rootindex + 1, pre.size(), pre),
mycopy(rootindex + 1, vin.size(), vin));
return root;
}
vector<int> mycopy(int l, int r, vector<int> v) {
return vector<int>(v.begin() + l, v.begin() + r);
}
};