1. 程式人生 > >《劍指Offer 1.二維數組中的查找》2019-03-25

《劍指Offer 1.二維數組中的查找》2019-03-25

一行 簡單 下標 一維數組 是否 ger repl array 一個

劍指Offer 第一題

  

題目描述

在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。 本人簡單的解題思路 就是通過二重循環,遍歷。查找數組中是否有目標數字,思路是簡單的,但是有個小坑 ,就是沒有進行數組越界判斷 少判斷了 array = [ [ ] ] 這種情況,最終通過的代碼為   
public class Solution {
    public boolean Find(int target, int
[][] array) { if(array[0].length<=0) return false; for(int i = 0 ;i<array.length;i++) { for(int j = 0;j<array.length;j++) { if(array[i][j] == target) {
return true; } } } return false; } }

但是這樣的效率就很低下了,還能進行優化,參考一下大佬們是怎麽進行優化的。



兩種思路
一種是:
把每一行看成有序遞增的數組,
利用二分查找,
通過遍歷每一行得到答案,
時間復雜度是nlogn
public class Solution {
    public boolean Find(int [][] array,int target) {
         
        
for(int i=0;i<array.length;i++){ int low=0; int high=array[i].length-1; while(low<=high){ int mid=(low+high)/2; if(target>array[i][mid]) low=mid+1; else if(target<array[i][mid]) high=mid-1; else return true; } } return false; } } 另外一種思路是: 利用二維數組由上到下,由左到右遞增的規律, 那麽選取右上角或者左下角的元素a[row][col]與target進行比較, 當target小於元素a[row][col]時,那麽target必定在元素a所在行的左邊, 即col--; 當target大於元素a[row][col]時,那麽target必定在元素a所在列的下邊, 即row++public class Solution { public boolean Find(int [][] array,int target) { int row=0; int col=array[0].length-1; while(row<=array.length-1&&col>=0){ if(target==array[row][col]) return true; else if(target>array[row][col]) row++; else col--; } return false; } }

其中還有點小坑 ,就是一定要確定好 數組遍歷的起始位置。

題目二、

請實現一個函數,將一個字符串中的每個空格替換成“%20”。例如,當字符串為We Are Happy.則經過替換之後的字符串為We%20Are%20Happy。

我的實現代碼:

  

public class Solution {
    public String replaceSpace(StringBuffer str) {
        return str.toString().replace(" ", "%20");
    }
}

總感覺自己實現的有點弱。這個題應該不會這麽簡單,膜拜一下大佬的代碼去。

鏈接:https://www.nowcoder.com/questionTerminal/4060ac7e3e404ad1a894ef3e17650423
來源:牛客網

/*
問題1:替換字符串,是在原來的字符串上做替換,還是新開辟一個字符串做替換!
問題2:在當前字符串替換,怎麽替換才更有效率(不考慮java裏現有的replace方法)。
      從前往後替換,後面的字符要不斷往後移動,要多次移動,所以效率低下
      從後往前,先計算需要多少空間,然後從後往前移動,則每個字符只為移動一次,這樣效率更高一點。
*/
public class Solution {
    public String replaceSpace(StringBuffer str) {
        int spacenum = 0;//spacenum為計算空格數
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)==‘ ‘)
                spacenum++;
        }
        int indexold = str.length()-1; //indexold為為替換前的str下標
        int newlength = str.length() + spacenum*2;//計算空格轉換成%20之後的str長度
        int indexnew = newlength-1;//indexold為為把空格替換為%20後的str下標
        str.setLength(newlength);//使str的長度擴大到轉換成%20之後的長度,防止下標越界
        for(;indexold>=0 && indexold<newlength;--indexold){ 
                if(str.charAt(indexold) == ‘ ‘){  //
                str.setCharAt(indexnew--, ‘0‘);
                str.setCharAt(indexnew--, ‘2‘);
                str.setCharAt(indexnew--, ‘%‘);
                }else{
                    str.setCharAt(indexnew--, str.charAt(indexold));
                }
        }
        return str.toString();
    }
}

看了別人的代碼之後,整個人都不好了,感覺自己實現的太簡單了。

題目描述

輸入一個鏈表,按鏈表值從尾到頭的順序返回一個ArrayList。 思路:一開始的思路就是直接遍歷 ListNode ,然後一個一個的放入ArrayList中,但是後來發現這個ListNode是自己寫的,只能通過一個一個的判斷.next 是否為空了,然後通過遞歸 或者 循環 添加所有的元素
/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.ArrayList;
public class Solution {
     ArrayList list = new ArrayList<Integer>();
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        if(listNode!=null){
            this.printListFromTailToHead(listNode.next);
            list.add(listNode.val);
        }
        return list;
    }
}

《劍指Offer 1.二維數組中的查找》2019-03-25