劍指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不要混了。基本函數記不清。需要紮實基礎。