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;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章