劍指offer刷題記錄——Java學習實戰(更新版記錄)

1.題目描述

在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。

解題思路:

              1.外循環遍歷每行元素
               2.如果每行第一個元素<target,並且最後一個元素>target,在該行找
               否則,退出該行,continue
               3.確定元素所在行後,查找該元素

簡單做法是暴力遍歷所有元素,但加一個判斷語句會跳過不必要的查詢比較。

public class Solution {
    public static void main(String[] args) {
        int arr[][]=new int[][]{{1,2,3},{2,4,6},{3,8,10},{4,9,12},{5,10,13}};
        int target=10;
        boolean t = Find(target, arr);
        System.out.println("查詢結果爲:"+t);
    }

    public static boolean Find(int target, int array[][])
    {
        /*思路:1.外循環遍歷每行元素
               2.如果每行第一個元素<target,並且最後一個元素>target,在該行找
               否則,退出該行,continue
               3.確定元素所在行後,查找該元素*/
      for(int i=0;i< array.length;i++)
          for(int j=0;j<array[i].length;j++)
          {
              if(array[i][0]<=target&&array[i][array[i].length-1]>=target)
              {
                  if(array[i][j]==target)
                  {
                      return true;
                  }
              }
              else
                  continue;
          }
        //最後一個元素都沒能找到

        return false;
    }

}

2.題目描述

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

        /*思路:
        1.找到首次出現" "的下標位置
        2.將該下標的元素進行替換
        3.下標位置+1,從新的下標開始往後找首次出現" "的位置*/

public class Solution {
    public static String replaceSpace(StringBuffer str) {
        //這題考察的是stringBuffer和string的相互轉換
        /*思路:
        1.找到首次出現" "的下標位置
        2.將該下標的元素進行替換
        3.下標位置+1,從新的下標開始往後找首次出現" "的位置*/
        int ind = str.indexOf(" ");
        while (ind <= str.length()) {
            if (str.indexOf(" ") >= 0)
            //System.out.println("存在空字符串");
            {
                str = str.replace(ind, ind + 1, "%20");
                int ind2 = ind + 2;
                ind = str.indexOf(" ", ind2);
            } 
            else
                break;
        }
        return str.toString();
    }


    public static void main(String args[])
    {
        //創建一個string變量,轉爲stringBuffer,帶入方法中,將返回值轉爲sting類型
        String str="We Are Happy!";
        StringBuffer str2=new StringBuffer();
        str2.append(str);
        str=replaceSpace(str2);
        System.out.println("新的字符串爲:"+str);
    }
}

 這個簡單的題讓我整複雜了,我用的是StringBuffer裏的替換字符串方法需要傳遞三個參數,實際上調用str.toString()方法將StringBuffer類對象轉爲String類,在調用String類的replaceAll(" ","%20")方法即可。

本題考察的是String類不能直接賦值給StringBuffer類

 

3.題目描述:輸入一個鏈表,按鏈表從尾到頭的順序返回一個ArrayList。

解題思路:
1.獲取鏈表的長度
2.創建數組list依次存放這些元素
3.創建數組list1,將list數組反過來存放在list1數組中

這裏它默認爲你創建了ListNode類

public class ListNode{
    int val;
    ListNode next =null;
    ListNode(int val){
        this.val=val;
    }
}//相當於C語言的結構體

代碼如下:帶測試用例

/**
 *    public class ListNode {
 *        int val;
 *        ListNode next = null;
 *
 *        ListNode(int val) {
 *            this.val = val;
 *        }
 *    }
 *
 */
import java.util.ArrayList;
public class Solution {
    /*解題思路:
1.獲取鏈表的長度
2.創建數組list依次存放這些元素
3.創建數組list1,將list數組反過來存放在list1數組中*/
    public static ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ListNode head=new ListNode(0);//頭指針
        ArrayList list=new ArrayList();
        ArrayList list1=new ArrayList();
        head.next=listNode;
        int len=0;
        while(head.next!=null){
            list.add(len,head.next.val);
            len++;
            head=head.next;
        }
        for (int i=0;i<len;i++)
        {
            list1.add(i,list.get(len-1-i));
        }
        return list1;
    }

    public static void main(String[] args) {
        ListNode listNode=new ListNode(1);
        ListNode listNode1=new ListNode(2);
        ListNode listNode2=new ListNode(3);
        listNode.next=listNode1;
        listNode1.next=listNode2;
        ArrayList temp=new ArrayList();
        temp= printListFromTailToHead(listNode);
        System.out.println(temp.get(0));
    }
}

習慣了寫C語言的鏈表,結構體,寫這個真的很難受。。

加油吧,零基礎肯代碼的小菜雞。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章