剑指offer-做题
1.二维数组中的查找(用了三种方法解答)
描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例1
输入:7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值:true
说明:存在7,返回true
示例2
输入:3,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值:false
说明:不存在3,返回false
代码如下(示例):
bool Find(int target, vector<vector<int> > array) {
//方法一:以vector版本的左下角为始点
if(array.size()==0)
return false;
int row=array.size();
int col=array[0].size();
int x=row-1;
int y=0;
while(x>=0&&y>=0&&x<row&&y<col)
{
if(array[x][y]==target)
return true;
else if(array[x][y]>target)
x--;
else
y++;
}
return false;
//第二种方法:全局遍历
if(array.size()==0)
return false;
int row=array.size();
int col=array[0].size();
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
if(array[i][j]==target)
return true;
}
}
return false;
//第三种方法:以vector版本的右上角为始点
if(array.size()==0)
return false;
int row=array.size();
int col=array[0].size();
int x=0;
int y=col-1;
while(x>=0&&y>=0&&x<row&&y<col)
{
if(array[x][y]==target)
return true;
else if(array[x][y]>target)
y--;
else
x++;
}
return false;
}
2.替换空格
描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
示例1
输入:“We Are Happy”
返回值:“We%20Are%20Happy”
代码如下(示例):
string replaceSpace(string s) {
// write code here
int sz=s.size();
//统计空格个数
int count=0;
for(int i=0;i<sz;i++)
{
if(s[i]==' ')
count++;
}
//计算总的长度:原来字符串长度+空格个数
int len=sz+count*2;
s.resize(len);
//从后向前访问
int end=len-1;
int cur=sz-1;
while(cur<end)
{
if(s[cur]!=' ')
s[end--]=s[cur];
else
{
s[end--]='0';
s[end--]='2';
s[end--]='%';
}
cur--;
}
return s;
}
3.从尾到头打印链表
描述
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
示例1
输入:{67,0,24,58}
返回值:[58,24,0,67]
代码如下(示例):
vector<int> printListFromTailToHead(ListNode* head) {
vector<int>v;
if(head!=NULL)
{
v.insert(v.begin(),head->val);
while(head->next!=NULL)
{
v.insert(v.begin(),head->next->val);
head=head->next;
}
}
return v;
}