Leetcode刷题 2021.03.10

Leetcode227 基本计算器 II

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

没有括号的限制,难度系数就直接下降一个档次。看了下题解和自己的思路差不多,由于乘除法的优先级是要高于加减法的。因此可以考虑使用栈优先对乘除法进行运算,最后在把栈里的元素按顺序做加减法就行了。

class Solution {
    public int calculate(String s) {
    	//用两个栈分别存放数据和操作符
        Deque<Long> num = new ArrayDeque<>();
        Deque<Character> opr = new ArrayDeque<>();
        char[] arr = s.toCharArray();
        int i = 0, n = arr.length;
        //首先处理乘除法
        while (i < n){
        	//遇到空字符直接跳过
            if (arr[i] == ' '){
                i++;
                continue;
            }
            //遇到数字,获取数字的数值
            if (Character.isDigit(arr[i])){
                long temp = 0;
                while (i < n && Character.isDigit(arr[i])){
                    temp = temp * 10 + arr[i] - '0';
                    i++;
                }
                num.push(temp);
                //看看操作符栈,如果是乘除法的话就做运算
                if (!opr.isEmpty() && (opr.peek() == '*' || opr.peek() == '/')){
                    long num1 = num.pop();
                    long num2 = num.pop();
                    // System.out.println(num1);
                    // System.out.println(num2);
                    long res = 0;
                    if (opr.peek() == '*'){
                        res = num2 * num1;
                    }else{
                        res = num2 / num1;
                    }
                    num.push(res);
                    opr.pop();
                }
            }else{
            	//如果是运算符的话,就直接入操作符栈
                opr.push(arr[i]);
                i++;
            }
        }
        while (!opr.isEmpty()){
        	//最后按照从左到右的顺序做加减法就行了
        	//注意deque的顺序是不一样的
            char operation = opr.removeLast();
            long num1 = num.removeLast();
            long num2 = num.removeLast();
            if (operation == '+'){
                num.addLast(num1 + num2);
            }else{
                num.addLast(num1 - num2);
            }
        }
        long ans = num.peek();;
        return (int) ans;
    }
}

Leetcode526 优美的排列

假设有从 1 到 N 的 N 个整数,如果从这 N 个数字中成功构造出一个数组,使得数组的第 i 位 (1 <= i <= N) 满足如下两个条件中的一个,我们就称这个数组为一个优美的排列。条件:

第 i 位的数字能被 i 整除
i 能被第 i 位上的数字整除
现在给定一个整数 N,请问可以构造多少个优美的排列?

看到n不会超过十五,那就不用想了,肯定就是回溯了。也比较简单,按照题意来尝试就行了。
有时候在想力扣这样给出的数字范围有点提示的感觉了,如果没有n不大于15的提示,可能会先取想其他的方法在想回溯。

class Solution {
    int[] arr;
    int res = 0;
    boolean[] isUsed;
    public int countArrangement(int n) {
        arr = new int[n];
        isUsed = new boolean[n + 1];
        helper(n, 1);
        return res;
    }

    private void helper(int n, int index){
        if (index > n){
            res++;
            return;
        }
        for(int i = 1; i <= n; i++){
        	//数字只能用一次,并且要满足给定的两个条件中的一个
            if (!isUsed[i] && ( i % index == 0 || index % i == 0)){
                isUsed[i] = true;
                helper(n, index + 1);
                isUsed[i] = false;
            }
        }
    }
}

Leetcode369 给单链表加一

用一个 非空 单链表来表示一个非负整数,然后将这个整数加一。

你可以假设这个整数除了 0 本身,没有任何前导的 0。

这个整数的各个数位按照 高位在链表头部、低位在链表尾部 的顺序排列。

链表题都不太难,看了题解是用。这道题和链表加法差不多,但是因为要从最后一位开始加起。所以考虑使用递归,从后向前加1。最后在头结点的时候判断一下,如果有余数,要在加一个节点。

class Solution {
    public ListNode plusOne(ListNode head) {
        if (head == null) return head;
        int append = helper(head);
        if (append == 0) return head;
        //最后头结点判断一下,是否还有余数
        ListNode dummyHead = new ListNode(1);
        dummyHead.next = head;
        return dummyHead;
    }

    private int helper(ListNode head){
    	//从后向前递归,最后返回1,否则就返回append和head的和域10的商
        if (head == null) return 1;
        int append = helper(head.next);
        int temp = head.val + append;
        head.val = temp % 10;
        return temp / 10;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值