6月30日的三題

劍指 Offer 09. 用兩個棧實現隊列

49. 字母異位詞分組

50. Pow(x, n)

-----------------------------------分割線-------------------------------------

劍指 Offer 09. 用兩個棧實現隊列

Difficulty: 簡單

用兩個棧實現一個隊列。隊列的聲明如下,請實現它的兩個函數 appendTaildeleteHead ,分別完成在隊列尾部插入整數和在隊列頭部刪除整數的功能。(若隊列中沒有元素,deleteHead 操作返回 -1 )

示例 1:

輸入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
輸出:[null,null,3,-1]

示例 2:

輸入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
輸出:[null,-1,null,null,5,2]

提示:

  • 1 <= values <= 10000
  • 最多會對 appendTail、deleteHead 進行 10000 次調用

Solution:一個棧作爲入口,一個棧作爲出口,出口棧沒有元素的時候,入口棧中的元素全部都添加到出口棧中

class CQueue {

		//Stack是實現Vector接口,線程安全的效率低,所以不用
    private LinkedList<Integer> stack1 = new LinkedList<>(); //入口棧
    private LinkedList<Integer> stack2 = new LinkedList<>(); //出口棧

    public CQueue() {
    }
    
    public void appendTail(int value) {
        stack1.add(value);
    }
    
    public int deleteHead() {
        if(stack2.isEmpty()){
            int size = stack1.size();
            if(size <= 0) return -1; //都沒有元素,返回-1
            
            for(int i=0; i<size; i++){
                stack2.add(stack1.remove(stack1.size()-1));
            }
        }
        return stack2.remove(stack2.size()-1);
    }
}

/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue obj = new CQueue();
 * obj.appendTail(value);
 * int param_2 = obj.deleteHead();
 */

49. 字母異位詞分組

Difficulty: 中等

給定一個字符串數組,將字母異位詞組合在一起。字母異位詞指字母相同,但排列不同的字符串。

示例:

輸入: ["eat", "tea", "tan", "ate", "nat", "bat"]
輸出:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

說明:

  • 所有輸入均爲小寫字母。
  • 不考慮答案輸出的順序。

Solution:使用HashMap的key存儲排序後的字符序列,val存儲原始的字符串

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

class Solution {

    public List<List<String>> groupAnagrams(String[] strs) {
        
        HashMap<String, List<String>> map = new HashMap<>();
                //注意這裏的key不能是char[],因爲char數組存的是數組的首地址,每個都不一樣
        for(int i=0; i<strs.length; i++){
            String str = strs[i];
            char[] chars = str.toCharArray();  
            Arrays.sort(chars);   // 排序
            String str1 = String.valueOf(chars);
            if(map.containsKey(str1)){
                map.get(str1).add(str);
            }
            else{
                List<String> temp = new ArrayList<>();
                temp.add(str);
                map.put(str1, temp);
            }
        }
        return new ArrayList<>(map.values());
    }
}

50. Pow(x, n)

Difficulty: 中等

實現 ,即計算 x 的 n 次冪函數。

示例 1:

輸入: 2.00000, 10
輸出: 1024.00000

示例 2:

輸入: 2.10000, 3
輸出: 9.26100

示例 3:

輸入: 2.00000, -2
輸出: 0.25000
解釋: 2-2 = 1/22 = 1/4 = 0.25

說明:

  • -100.0 < x < 100.0
  • n 是 32 位有符號整數,其數值範圍是 [−231, 231 − 1] 。

Solution:快速冪運算 + 遞歸

//快速冪運算 + 遞歸
class Solution {
    public double myPow(double x, int n) {
        
        if(x==1 || n==0) return 1;  //處理邊界情況

        double res = 1;

        long N = n; //防止轉換成負數時越界,特別針對Integer.MIN_VALUE
        boolean negtive = false;
        if(n<0){
            negtive = true;
            N = -N;
        }
        
        return negtive? 1/myPowHelp(x, N): myPowHelp(x, N);
    }

    public double myPowHelp(double x, long n){

        if(n == 0) return 1; //遞歸終止條件
        if(n == 1) return x;  //遞歸終止條件

        double half = myPowHelp(x, n/2);  //將計算的結果存儲下來,重複使用
        if(n%2==0){
            return half * half;
        }
        else{
            return half * half * x;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章