剑指offer之:1-3总结(二维数组中的查找;替换空格;从头到尾打印列表)
作者:互联网
剑指offer回顾总结
本文重新回顾剑指offer的题目,给出思路,并对易错点进行总结记录。
1. 题目
- 1)二维数组的查找
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 - 2)替换空格
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 - 3)从头到尾打印列表
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
2. 思路
-
1)二维数组的查找
– 主要是从右上角开始查找(类似二分法) -
2)替换空格
– 第1步: 首先计算空格数
– 第2步: 添加空格,计算总长度
– 第3步: 将原数据,从后往前转换(for循环)。 -
3)从头到尾打印列表
– 使用堆栈。
3.代码块
public class Solution {
public boolean Find(int target, int [][] array) {
int len1 = array[0].length;
int len2 = array.length;
if(len1 <=0 || len2 <=0){
return false;
}
int i = 0;
int j = len1 - 1;
while(i < len2 && j >= 0){
if(array[i][j] == target){
return true;
}else if(array[i][j] < target){
i++;
}else{
j--;
}
}
return false;
}
}
代码解析1:
需要注意while的使用。
有一个起始值,然后满足条件时进行循环,直到不满足条件结束。
注意与for的区分。
note:“局部变量在栈内存中存在,当for循环语句结束,那么变量会及时被gc(垃圾回收器)及时的释放掉,不浪费空间。如果使用循环之后还想去访问循环语句中控制那个变量,使用while循环”
public class Solution {
public String replaceSpace(StringBuffer str) {
if(str.length() <= 0){
return "";
}
int num = 0;
for(int i = 0; i < str.length(); i++){
if(str.charAt(i) == ' '){
num++;
}
}
int len1 = str.length() + 2 * num;
StringBuffer str1 = new StringBuffer();
str1.setLength(len1);
int j = len1 - 1;
for(int k = str.length() - 1; k >= 0; k--){
if(str.charAt(k) == ' '){
str1.setCharAt(j--, '0');
str1.setCharAt(j--, '2');
str1.setCharAt(j--, '%');
}else{
str1.setCharAt(j--, str.charAt(k));
}
}
// return str1.toString();
return String.valueOf(str1);
}
}
代码解析2:
1.设置StringBuffer长度时,使用setLength()函数。
反例:我使用圆括号设置长度,不能通过。
2.设置新字符时,使用charAt(索引,‘字符’),不要使用赋值。
3.以原字符串为循环条件,在charAt(j–,…)自减函数对新字符串的索引进行更新,一层for循环就可以。
总结:对StringBuffer的相关函数不熟悉。
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.ArrayList;
import java.util.Stack;//自己导包!
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> result = new ArrayList<Integer>();
if(listNode == null){
return result;
}
Stack<Integer> st = new Stack<Integer>();
while(listNode != null){
st.push(listNode.val);
listNode = listNode.next;
}
while(!st.isEmpty()){
result.add(st.pop());
}
return result;
}
}
代码解析3:
- 不需要使用length,直接使用非空作为判断条件。
- 但是需要注意null还是isEmpty()。
他们的区别是null是对象,后者是值为空。 - 不要忘记导包
import java.util.Stack;
(如果是在本地编译器可能不需要,会有提醒自动添加Java包) - stack使用的是add,不是push不要混了。基本函数记不清。需要扎实基础。
标签:return,listNode,int,str1,offer,空格,ArrayList,从头到尾,public 来源: https://blog.csdn.net/Irving_zhu/article/details/104757207