1. 程式人生 > >劍指offer 第二章

劍指offer 第二章

1 資料結構
1.1 陣列

面試題3:在一個二維陣列中,每一行都按照從左往右遞增的順序排列,每一列都按照從上到下遞增的順序排列。請完成一個函式,輸入這樣的一個二維陣列和整數,判斷陣列中是否存在該整數。


public class FindElement {

    public static void main(String[] args) {
        int [][] arr ={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
        System.out.println(search(arr,7));
    }

    private
static boolean search(int[][] arr, int value) { int a = arr[0].length; int b = arr.length; int i = 0;//行數 int j = a-1;//列數 while (i<=b-1&&j>=0){ if(arr[i][j] == value){ return true; } if(arr[i][j]>value
){ j--; }else{ i++; } } return false; } }

1.2 字串
  面試題4:替換空格
  請實現一個函式,把字串中的每個空格替換成“%20”。例如輸入“we are happy.”,則輸出“we%20are%20happy.”

import java.util.Scanner;

public class ReplaceBlank {

    public static String replace1
(String str){ String str1 = new String(str); return str1.replace(" ", "%20"); } public static String replace2(String str){ String str1 = new String(str); char[] charArr = str1.toCharArray(); int originalLength = charArr.length; int count = 0; for (int i=0;i<charArr.length;i++){ char item = charArr[i]; if (item == ' '){ count++; } } int newLength = originalLength + count*2; char[] newcharArr = new char[newLength]; int indexOfOriginal = originalLength-1; int indexOfNew = newLength-1; while (indexOfOriginal >= 0){ if (charArr[indexOfOriginal] == ' '){ newcharArr[indexOfNew--] = '0'; newcharArr[indexOfNew--] = '2'; newcharArr[indexOfNew--] = '%'; indexOfOriginal--; } else{ newcharArr[indexOfNew--] = charArr[indexOfOriginal--]; } } return String.valueOf(newcharArr); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s0 = sc.nextLine(); System.out.println(replace1(s0)); System.out.println(replace2(s0)); } }

1.3 連結串列
  連結串列的空間效率比陣列高,但時間效率O(n)比陣列O(1)低。
  
面試題6:輸入一個連結串列的頭節點,從尾到頭反過來列印每個節點的值。

import java.util.Stack;

public class No5PrintListNodeReverse {

    public static void main(String[] args) {
        ListNode head = new ListNode(0);
        ListNode node_1 = new ListNode(1);
        ListNode node_2 = new ListNode(2);
        ListNode node_3 = new ListNode(3);
        ListNode node_4 = new ListNode(4);
        head.setNext(node_1);
        node_1.setNext(node_2);
        node_2.setNext(node_3);
        node_3.setNext(node_4);
        node_4.setNext(null);
        System.out.println("第一種方式:遞迴實現");
        printListReverse_1(head);
        System.out.println();
        System.out.println("第二種方式:棧結構實現");
        printListReverse_2(head);

    }
    //用遞迴實現
    private static void printListReverse_1(ListNode head) {
        if (head != null){
            if(head.getNext() != null){
                printListReverse_1(head.getNext());
            }
            System.out.print(head.getValue() + " ");
        }

    }

    //用棧實現
    private static void printListReverse_2(ListNode head){
        Stack<Integer> s = new Stack<Integer>();
        ListNode p = head;
        //進棧
        while (p != null){
            //每經過一個結點,把節點放到一個棧中
            s.push(p.getValue());
            p = p.getNext();
        }
        //出棧
        while (!s.isEmpty()){
            //遍歷完整個連結串列以後,從棧頂開始逐個輸出結點的值
            System.out.print(s.pop()+" ");
        }
        System.out.println();
    }

}

class ListNode{
    private int value;
    private ListNode next;

    public ListNode(int value){
        this.value = value;
    }

    public ListNode(int value, ListNode next){
        this.value = value;
        this.next = next;
    }

    public void setValue(int value){
        this.value = value;
    }

    public void setNext(ListNode next){
        this.next = next;
    }

    public int getValue(){
        return this.value;
    }

    public ListNode getNext(){
        return this.next;
    }

}