剑指 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;
}
}
}