數據結構與算法-數組練習題

工作的時候,一個bug改一天,一個需求看一週。刷題的時候,三個問題解一天,還是簡單的那種,急躁的時候不要繼續當前的事情,急躁的時候不要繼續當前的事情,急躁的時候不要繼續當前的事情(手動敲三遍,希望能牢記)。下面是解了一天的三個leetcode簡單小問題:

package com.freshbin.basics.array;

import java.util.HashMap;

/**
 * 面試題 01.01. 判定字符是否唯一
 *
 * 實現一個算法,確定一個字符串 s 的所有字符是否全都不同。
 *
 * 示例 1:
 * 輸入: s = "leetcode"
 * 輸出: false
 *
 * 示例 2:
 * 輸入: s = "abc"
 * 輸出: true
 *
 * 限制:
 * 0 <= len(s) <= 100
 * 如果你不使用額外的數據結構,會很加分。
 *
 * @author freshbin
 * @date 2020/5/1 11:18
 */
public class Solution1442 {

    /**
     * 思路:遍歷字符串,使用hashMap保存每一個字符,如果該字符已經存在,直接false
     *
     * @param astr
     * @return
     */
    public boolean isUnique(String astr) {
        HashMap<Character, Integer> keyMap = new HashMap<>();
        for(int i = 0; i < astr.length(); i++) {
            if(keyMap.containsKey(astr.charAt(i))) {
                return false;
            }
            keyMap.put(astr.charAt(i), 1);
        }

        return true;
    }

    public static void main(String[] arg) {
        String test = "abca";
        Solution1442 solution1442 = new Solution1442();
        System.out.println(solution1442.isUnique(test));
    }
}
package com.freshbin.basics.array;

/**
 * 面試題 10.01. 合併排序的數組
 * 給定兩個排序後的數組 A 和 B,其中 A 的末端有足夠的緩衝空間容納 B。 編寫一個方法,將 B 合併入 A 並排序。
 *
 * 初始化 A 和 B 的元素數量分別爲 m 和 n。
 *
 * 示例:
 * 輸入:
 * A = [1,2,3,0,0,0], m = 3
 * B = [2,5,6],       n = 3
 * 輸出: [1,2,2,3,5,6]
 *
 * @author freshbin
 * @date 2020/5/1 17:47
 */
public class Solution1496 {
    /**
     * 思路:遍歷B數組,與A數組從下標爲0的值開始往後比較
     * 如果B數組的值比A數組當前下標的值大,那麼A數組下標繼續往後走
     * 否則,將A數組當前下標以及後面的值都往後推一個索引,
     * 將A數組當前下標的值設爲B數組當前值
     * 最後如果B數組還沒有全部放入A數組,那麼將剩下的數據全部放入A數組後面
     *
     * @param A
     * @param m
     * @param B
     * @param n
     */
    public void merge(int[] A, int m, int[] B, int n) {
        int aIndex = 0;
        int addNum = 0;
        for(int i = 0; i < n; i++) {
            for(; aIndex < m+addNum; aIndex++) {
                if(B[i] <= A[aIndex]) {
                    for(int nextIndex = m+addNum; nextIndex > aIndex; nextIndex--) {
                        A[nextIndex] = A[nextIndex-1];
                    }
                    A[aIndex] = B[i];
                    aIndex++;
                    addNum++;
                    break;
                }
            }
        }
        for(; addNum < n; addNum++) {
            A[m+addNum] = B[addNum];
        }
    }

    public static void main(String[] arg) {
        int[] A = {4,0,0,0,0,0};
        int m = 1;
        int[] B = {1,2,3,5,6};
        int n = 5;
        Solution1496 solution1496 = new Solution1496();
        solution1496.merge(A, m, B, n);

        for(int i : A) {
            System.out.print(i + " ");
        }
    }
}
package com.freshbin.basics.array;

/**
 * 面試題29. 順時針打印矩陣
 *
 * 輸入一個矩陣,按照從外向裏以順時針的順序依次打印出每一個數字。
 * -
 * 示例 1:
 * 輸入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
 * 輸出:[1,2,3,6,9,8,7,4,5]
 *
 * 示例 2:
 * 輸入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
 * 輸出:[1,2,3,4,8,12,11,10,9,5,6,7]
 *
 * @author freshbin
 * @date 2020/5/1 14:05
 */
public class Solution1577 {
    /**
     * 思路:順時針打印,所以流程一直都是從左到右,從上到下,從右到左,從下到上
     *  ps:一開始想到了這樣處理,可是在處理邊界值的時候,寫得亂七八糟,結果寫了一兩個小時
     *  而且一運行還是錯的,當時就崩潰了,於是以爲這種想法不太行,
     *  想去看看有沒有更巧妙的解法,看了大佬的題解,發現也是這個思路,
     *  再一看邊界處理,驚呼,還能這麼簡單,代碼還這麼簡潔
     *
     * @param matrix
     * @return
     */
    public int[] spiralOrder(int[][] matrix) {
        if(matrix == null || matrix.length == 0) {
            return new int[0];
        }

        int left = 0;
        int right = matrix[0].length - 1;
        int top = 0;
        int down = matrix.length - 1;
        int[] passArray = new int[matrix.length*matrix[0].length];
        int index = 0;

        while(true) {
            for(int i = left; i <= right; i++) {
                passArray[index++] = matrix[top][i];
            }
            if(++top > down) {
                break;
            }
            for(int i = top; i <= down; i++) {
                passArray[index++] = matrix[i][right];
            }
            if(--right < left) {
                break;
            }
            for(int i = right; i >= left; i--) {
                passArray[index++] = matrix[down][i];
            }
            if(--down < top) {
                break;
            }
            for(int i = down; i >= top; i--) {
                passArray[index++] = matrix[i][left];
            }
            if(++left > right) {
                break;
            }
        }
        return passArray;
    }

    public static void main(String[] arg) {
        int[][] material = {{1,2,3},{4,5,6},{7,8,9}};
        Solution1577 solution1577 = new Solution1577();
        int[] array = solution1577.spiralOrder(material);
        for(int i : array) {
            System.out.print(i + " ");
        }
    }
}

看了三個類的創建時間,很好,三個問題的創建時間間隔大概都是3,4個小時,休息,睡覺,明天繼續鏈表的簡單題。

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