剑指offer Ac 三道题,现在review下:
题目一:从尾到头打印链表
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
我的思路:
1.链表值从头到尾顺序放入vector中
2.逆序vector
代码实现:
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> Data;
ListNode *Tmp;
Tmp = head;
while( Tmp != NULL ){
Data.push_back(Tmp -> val);
Tmp = Tmp -> next;
}
int size = Data.size();
for(int i = 0; i < size / 2; i++){
int temp = Data[i];
Data[i] = Data[size - 1 - i];
Data[size - 1 -i] = temp;
}
return Data;
}
};
代码问题未加边界条件:if(head != NULL)执行主程序。
其他解法:
逆序问题可考虑递归,堆栈的方法。
递归:注意将value设为全局变量,节省内存;
class Solution{
public:
vector<int> value;
vector<int> printListFromTailToHead(ListNode* head){
ListNode *p = NULL;
p = head;
if(p != NULL){
if(p -> Next != NULL){
printListFromTailToHead(p -> next);
}
value.push_back(p -> val);
}
return value;
栈思路:
class Solution{
public:
vector<int> printListFromTailToHead(ListNode* head){
vect<int> value;
ListNode *p = NULL;
p = head;
stack<int> stk;
while(p != NULL)
{
stk.push(p -> val);
p = p -> next;
}
while( !stk.empty() )
{
value.push_back(stk.top());
stk.pop();
}
return value;
}
}
题目二:替换空格
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
比较简单
题目三:二维数组的查找
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路:从左下角开始查找较快。
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int rowCount = array.size();
int colCount = array[0].size();
int i = rowCount - 1, j = 0;
while(array[i][j] != target && (i != -1 && j != colCount))
{
if(array[i][j] > target)
i--;
else
j++;
}
if( i != -1 && j != colCount )
return true;
else
return false;
}
};
注意边界条件不要写错((array[i][j] != target && (i != -1 && j != colCount)