1.二维数组中的查找
题目描述:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路:
1.代码要求使用vector来保存二维数组的,那么我们首先应该熟悉如何用vector来表示行以及列;
2.解题思路有多种,比如我们可以从左下角或者右上角开始扫描整个数组,为什么?从题目可以知道,从上到下,是递增的;从左到右也是递增的。假设我们从左下角开始遍历,如果他大于这个数值,可以排除他所在的行;如果他小于的话,可以排除他所在的列。那我们每次判断就可以缩小一行或者一列的范围,直到找到这个数字。
3.我是以右上角开始遍历的,小伙伴们可以试一下左下角的遍历方法~~~
C++代码:
class Solution {
public:
bool Find(vector<vector<int> > array,int target) {
int rows = array.size();
int columns = array[0].size();
int i=0;
int j=columns-1;
while(i<rows && j>=0){
if(target == array[i][j]){
return true;
}
if(target>array[i][j]){
i++;
continue;
}
if(target<array[i][j]){
j--;
continue;
}
}
return false;
}
};
2.替换空格
题目描述:
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
解题思路:
1.遍历整个字符串,统计空格出现的次数
2.因为所要替换的字符串为'%20',把字符串看成是一个数组,那么‘%20’是需要占3位的,所以们应该算出替换后的字符串的长度=原来的字符串长度+空格数*2;
3.在我们统计空格数的时候是从左到右统计的,而填充字符时就应该变成从右向左。
4.Ps.其实C++有一个库函数replaceAll(),他具有两个参数(‘被替换的字符’,‘想要替换的字符’),但用的时候一定要保证位置留够,不要塞不下~~
class Solution {
public:
void replaceSpace(char *str,int length) {
int newlength=0;
int space_num=0;
for(int i=0;i<length;i++){
if(str[i]==' '){
space_num++;
}
}
newlength = length + space_num*2;
int m = newlength-1;
for(int num=length-1;num>=0;num--){
if(str[num]==' '){
str[m--]='0';
str[m--]='2';
str[m--]='%';
}else{
str[m--]=str[num];
}
}
}
};
3.从尾到头打印链表
题目描述:
输入一个链表,从尾到头打印链表每个节点的值。
解题思路:
可以提供两种方法:
1.先遍历一遍链表,记录链表的长度;再根据长度重新开辟一个数组,再从后往前遍历一遍链表,将链表值放入数组中打印出来就可以了。
2.想一下,从尾到头首先是不是可以想到栈?先进后出的原则,我们可以将扫描到的链表值放入栈中,然后直接取出就可以了。
<span style="font-size:14px;">/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(struct ListNode* head) {
std::stack<ListNode*>stk;
vector<int>value;
ListNode* p=head;
while(p!=NULL){
stk.push(p);
p=p->next;
}
ListNode* ps;
while(!stk.empty()){
p = stk.top();
value.push_back(p->val);
stk.pop();
}
return value;
}
};</span>