劍指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:

  1. 不需要使用length,直接使用非空作爲判斷條件。
  2. 但是需要注意null還是isEmpty()。
    他們的區別是null是對象,後者是值爲空。
  3. 不要忘記導包import java.util.Stack;(如果是在本地編譯器可能不需要,會有提醒自動添加Java包)
  4. stack使用的是add,不是push不要混了。基本函數記不清。需要紮實基礎。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章