牛客網刷題

1. 二維數組中的查找(難度:易)

題目描述

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

思路

最外層保證不出數組邊界,從左上角開始,依次向深層遞歸數組

解法

public class Solution {
    public boolean Find(int target, int [][] array) {
        int i=0;
        int j=0;
        return func(i,j,array,target);  //從array[0][0]開始遞歸
    }
    public boolean func(int i,int j,int [][] array, int target){
        int row = array.length;
        int col = array[0].length;
        if(i >= row || j >= col){  //保證沒有出界
            return false;
        }
        if(array[i][j] < target){  //向下和向右遞歸
            return func(i+1,j,array,target)||func(i,j+1,array,target);
        }else if(array[i][j]==target){
            return true;
        }else{
            return false;
        }
    }
}

2. 替換空格(難度:易)

題目描述

請實現一個函數,將一個字符串中的每一個空格替換成「%20」。例如,當字符串爲We Are Happy.則通過替換以後的字符串爲We%20Are%20Happy。app

思路

感受沒啥思路的函數

解法

public class Solution {
    public String replaceSpace(StringBuffer str) {
    	while(str.indexOf(" ")!=-1) {
    		str.replace(str.indexOf(" "), str.indexOf(" ")+1, "%20");
    	}
    	return str.toString();
    }
}

3. 從頭至尾打印鏈表(難度:易)

題目描述

輸入一個鏈表,按鏈表值從尾到頭的順序返回一個ArrayList。題目給定了鏈表節點的類定義:this

/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/spa

思路

關鍵在於一個反轉鏈表,一個起始指針,一個終止指針,兩者互換值,並不斷靠近,當起始指針在終止指針右邊或相遇時結束指針

解法

/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> arr = new ArrayList<>();
        if(listNode==null) {
        	return arr;
        }
        arr.add(listNode.val);
        while(listNode.next!=null) {
        	listNode = listNode.next;
        	arr.add(listNode.val);
        }
        int i = 0;
        int j = arr.size()-1;
        for(;i<=j;i++,j--) {
        	int temp = arr.get(i);
        	arr.set(i, arr.get(j));
        	arr.set(j, temp);
        }
        return arr;
    }
}

4. 旋轉數組的最小數字(難度:易)

題目描述

把一個數組最開始的若干個元素搬到數組的末尾,咱們稱之爲數組的旋轉。 輸入一個非減排序的數組的一個旋轉,輸出旋轉數組的最小元素。 例如數組{3,4,5,1,2}爲{1,2,3,4,5}的一個旋轉,該數組的最小值爲1。 NOTE:給出的全部元素都大於0,若數組大小爲0,請返回0。code

思路

第一個注意的是,數組爲空的時候,返回0;排序

第二個注意的是旋轉數組只搬一次;遞歸

第三個注意的是,若干個元素包含0個元素的狀況。

解法

import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) {
        if(array.length == 0){
            return 0;
        }else{
            for(int i=0;i<array.length-1;i++){
                if(array[i+1]<array[i]){
                    return array[i+1];
                }
            }
            return array[0];
        }
    }
}

5. 斐波拉契數列(難度:易)

題目描述

你們都知道斐波那契數列,如今要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項爲0)。

n<=39

思路

感受沒什麼好說的

解法

public class Solution {
    public int Fibonacci(int n) {
        if(n==0){
            return 0;
        }
        if(n==1||n==2){
            return 1;
        }
        int a = 1;
        int b = 1;
        int temp;
        for(int i=3;i<=n;i++){
            b = a+b;
            temp = a;
            a = b;
            b = temp;
        }
        return a;
    }
}

6. 跳臺階(難度:易)

題目描述

一隻青蛙一次能夠跳上1級臺階,也能夠跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(前後次序不一樣算不一樣的結果)。

思路和解法

參考第5題

7. 變態跳臺階(難度:易)

題目描述

一隻青蛙一次能夠跳上1級臺階,也能夠跳上2級……它也能夠跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。

思路

計算事後發現就是2的target-1次方

解法

public class Solution {
    public int JumpFloorII(int target) {
        return (int)Math.pow(2,target-1);
    }
}

8. 鏈表中倒數第k個節點

題目描述

輸入一個鏈表,輸出該鏈表中倒數第k個結點。

思路

侮辱智商的題目

解法

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        int count=0;
        ListNode p = head;
        while(p!=null){
            count+=1;
            p=p.next;
        }
        if(k>count){
            return null;
        }
        p = head;
        for(int i=1;i<=count-k;i++){
            p = p.next;
        }
        return p;
    }
}
相關文章
相關標籤/搜索