工作的時候,一個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個小時,休息,睡覺,明天繼續鏈表的簡單題。