劍指 Offer 09. 用兩個棧實現隊列
49. 字母異位詞分組
50. Pow(x, n)
-----------------------------------分割線-------------------------------------
劍指 Offer 09. 用兩個棧實現隊列
Difficulty: 簡單
用兩個棧實現一個隊列。隊列的聲明如下,請實現它的兩個函數 appendTail
和 deleteHead
,分別完成在隊列尾部插入整數和在隊列頭部刪除整數的功能。(若隊列中沒有元素,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;
}
}
}