打卡代码随想录Day5

今天进入队列和栈的学习。

1.括号匹配问题(力扣20)

public boolean isValid(String s) {
    if(s.length()<=1)
        return false;
    Stack<Character> stack = new Stack<>();
    for (int i = 0; i < s.length(); i++) {
        if(s.charAt(i)=='('||s.charAt(i)=='['||s.charAt(i)=='{'){
            stack.push(s.charAt(i));
        }
        else
            if(stack.isEmpty())
                return false;
            else if(s.charAt(i) == match(stack.peek()))
                stack.pop();
                else
                    return false;
    }
    if(stack.empty())
        return true;
    else
        return false;
}
public char match(char c){
    if(c=='(')
        return ')';
    else if (c=='[')
        return ']';
    else
        return '}';
}

2.删除字符串中的所有相邻重复项(力扣1047)

可以把此题当作匹配题做,一旦遇到和栈顶重复的字符,则将字符弹出。

    public String removeDuplicates(String s) {
        //Stack为ArrayDeque的古老实现类
//        Stack<Character> stack = new Stack<>();
        ArrayDeque<Character> stack = new ArrayDeque<>();
        for (int i = 0; i < s.length(); i++) {
            if(stack.isEmpty()||stack.peek()!=s.charAt(i))
                stack.push(s.charAt(i));
            else
                stack.pop();
        }
        StringBuilder sb = new StringBuilder();
        while (stack.size()!=0){
            sb.append(stack.pop());
        }
        sb.reverse();
        return sb.toString();
    }

3.逆波兰表达式求值(力扣150)

用栈,遇到数字入栈,遇到操作符则出栈两个元素,用第二个出栈的操作第一个出栈(注意主要是减法和除法),结果继续进栈。最终栈中元素即为结果。

public int evalRPN(String[] tokens) {
    Deque<Integer> deque = new ArrayDeque<>();
    for (int i = 0; i < tokens.length; i++) {
        if(tokens[i].equals("+"))
            deque.push(deque.pop()+deque.pop());
        else if(tokens[i].equals("-")){
            int a = deque.pop();
            int b = deque.pop();
            deque.push(b-a);
        }
        else if(tokens[i].equals("*"))
            deque.push(deque.pop()*deque.pop());
        else if(tokens[i].equals("/")){
            int a = deque.pop();
            int b = deque.pop();
            deque.push(b/a);
        }
        else deque.push(Integer.parseInt(tokens[i]));
    }
    return deque.pop();
}

*4.滑动窗口最大值(力扣239)

这里第一次引入了单调队列的知识,维护一个队内元素具有单调递增或者单调递减的队列。对于本题需要找到滑动窗口的最大值,采用单调递减队列,我们规定若窗口移除的元素正好是队头元素,则队头元素出队,若窗口加入的元素比队尾元素大,则移除队尾元素,保证队列的单调递减性。

class MyDeque{
    Deque<Integer> deque = new LinkedList<>();
    public MyDeque(){

    }
    //移除元素
    public void poll(int val){
        if(!deque.isEmpty() && val == deque.peek())
            deque.poll();
    }
    //加入元素
    public void offer(int val)
    {
        while (!deque.isEmpty() && val > deque.getLast()) {
        deque.removeLast();
    }
        deque.offer(val);
    }
    public int peek(){
        return deque.peek();
    }
}
public int[] maxSlidingWindow(int[] nums, int k) {
    //若滑动窗口移除的是单调队列的出口元素,则弹出队列出口元素;
    //若滑动窗口加入的元素大于单调队列的入口元素,则弹出队列入口元素
    if(nums.length==1)
        return nums;
    MyDeque deque = new MyDeque();
    int[] res = new int[nums.length-k+1];
    int num = 0;
    for (int i = 0; i < k; i++) {
        deque.offer(nums[i]);
    }
    res[num++] = deque.peek();
    for (int i = k; i < nums.length; i++) {
        //滑动窗口移除最前面的元素时,
        deque.poll(nums[i - k]);
        //滑动窗口加入最后面的元素
        deque.offer(nums[i]);
        //记录对应的最大值(此时单调队列的队头)
        res[num++] = deque.peek();
    }
    return res;
}

*5.前k个高频元素(力扣347)

本题采用先统计频数(利用map)再对频数排序的方法可以做,但是时空复杂度都很高。选择采用优先级队列,优先级队列其实是堆,分为大顶堆小顶堆,本题采用小顶堆,将队列中最后k个元素(队列中存放的是entries,我们把根据value排序后的对应的key输出)找到即为答案。

public int[] topKFrequent(int[] nums, int k) {
//        HashMap<Integer,Integer> hm = new HashMap<>();
//        int[] res = new int[k];
//        int[] res1 = new int[k];
//        for (int i = 0; i < nums.length; i++) {
//            hm.put(nums[i],hm.getOrDefault(nums[i],0)+1);
//        }
//        Object[] arr = hm.values().toArray();
//        Arrays.sort(arr);
//        for (int i = 0; i < k ; i++) {
//            res[i] = (Integer) arr[arr.length-1-i];
//        }
//        int num = 0;
//        Iterator iterator = hm.keySet().iterator();
//        while (iterator.hasNext()){
//            int key = (int)iterator.next();
//            for (int i = 0; i < k; i++) {
//                if(hm.get(key)==res[i]){
//                    res1[num++] = key;
//                    if(num==k)
//                        return res1;
//                    break;
//                }
//            }
//        }
//        return res1;
        //采用优先级队列
        HashMap<Integer,Integer> hm = new HashMap<>();
        int[] res = new int[k];
        for (int i = 0; i < nums.length; i++) {
            hm.put(nums[i],hm.getOrDefault(nums[i],0)+1);
        }
        Set<Map.Entry<Integer,Integer>> entries = hm.entrySet();
        //建立小顶堆,若大顶堆则为o2.getValue()-o1.getValue()
        PriorityQueue<Map.Entry<Integer,Integer>> queue = new PriorityQueue<>((o1, o2) -> o1.getValue() - o2.getValue());
        for (Map.Entry<Integer, Integer> entry : entries) {
            queue.offer(entry);
            if (queue.size() > k) { //本优先级队列采用的小根堆,取最后k个
                queue.poll();
            }
        }
        for (int i = k - 1; i >= 0; i--) {
            res[i] = queue.poll().getKey();
        }
        return res;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了实现h5页面的打功能,需要使用HTML、CSS和JavaScript来编写代码。 首先,在HTML中创建一个打按钮,并为其添加一个点击事件,以触发打功能。可以使用button标签来创建按钮,如下所示: ```html <button id="clockInButton" onclick="clockIn()">打</button> ``` 接下来,在JavaScript中定义一个打函数,该函数将在按钮点击时执行。在函数中,可以获取当前时间,并将其保存到一个变量中。可以使用`new Date()`来获取当前时间,再使用`toLocaleString()`方法将其转换为字符串格式。 ```javascript function clockIn() { var currentTime = new Date().toLocaleString(); // 将当前时间保存到变量currentTime中 // 其他打功能代码... } ``` 如果需要将打记录保存到服务器或本地存储中,可以使用JavaScript中的相关方法,如`XMLHttpRequest`或`localStorage`。 ```javascript function clockIn() { var currentTime = new Date().toLocaleString(); // 其他打功能代码... // 将打记录发送到服务器 var xhr = new XMLHttpRequest(); xhr.open('POST', 'http://example.com/clock-in', true); xhr.setRequestHeader('Content-type', 'application/json'); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { console.log('打成功!'); } }; xhr.send(JSON.stringify({ time: currentTime })); // 或者将打记录保存到本地存储 localStorage.setItem('clockInTime', currentTime); } ``` 最后,可以使用CSS来美化打按钮的样式,如背景颜色、边框样式、字体颜色等。 ```css #clockInButton { background-color: #007bff; border: none; color: white; padding: 10px 20px; font-size: 16px; } ``` 通过编写以上代码,就可以实现h5页面的打功能了。当用户点击打按钮时,会获取当前时间并将其保存到服务器或本地存储中,从而完成打操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值