【每日一题】1523. 在区间范围内统计奇数数目,860. 柠檬水找零

1523. 在区间范围内统计奇数数目 - 力扣(LeetCode)

给你两个非负整数 low 和 high 。请你返回 low  high 之间(包括二者)奇数的数目。

示例 1:

输入:low = 3, high = 7
输出:3
解释:3 到 7 之间奇数数字为 [3,5,7] 。

示例 2:

输入:low = 8, high = 10
输出:1
解释:8 到 10 之间奇数数字为 [9] 。

提示:

  • 0 <= low <= high <= 10^9
class Solution {
    public int countOdds(int low, int high) {
         int ans = 0;
         ans += (low%2==0?0:1);
         if(high!=low)
         ans += (high%2==0?0:1);
         return ans!=0?((high-low-1)/2+ans):((high-low)/2+ans);
    }
}

         这是一道简单题。读完题目之后,要求奇数个数,最直接简单的想法就是去循环,然后从头判断到尾。但是,实际上是不需要的。首先要清楚的一点是,奇数偶数是交替出现的。在不考虑特殊情况的前提下,如果给一个范围,最容易想到就是中间奇数偶数各一半。所以只需要将(high-low)/2即可。但实际情况有可能有变化,比如,给的两个数的可能一样,给的两个数可能都是偶数,都是奇数,或者一奇数一偶数。如果边界的两个都是奇数,那么实际过程中需要再减掉一个数再除。如果边界的两个都是偶数,那么实际上边界相减完除2就是奇数的个数。而边界有一个是奇数的则是正常情况(因为奇偶交替,如果正常那么相减+1除2就是正常的)。因为(1)边界两个数都包含的情况下相减,本身会少掉一个数。(2)由于可能会出现两个相同的数,所以边界需要先进行判断。(3)/2的运算,在0.5的时候是不会算做1的。【这里博主由于前面判断边界时已经算过边界的个数了,所以最后表达式会有变化。】奇偶边界的情况下,由于前面判断过了,所以到return时ans=1,无论减不减1,结果都没差,因为/2一样。奇奇边界的情况下,由于前面把两个都判断完了,所以相减完实际范围的奇数是要少一个的。偶偶情况下则刚好就是相减/2。

        用这样写一下时间复杂度也是降到很低的程度:

 

860. 柠檬水找零

在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。

每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。

注意,一开始你手头没有任何零钱。

给你一个整数数组 bills ,其中 bills[i] 是第 i 位顾客付的账。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。

示例 1:

输入:bills = [5,5,5,10,20]
输出:true
解释:
前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。
第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。
第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。
由于所有客户都得到了正确的找零,所以我们输出 true。

示例 2:

输入:bills = [5,5,10,10,20]
输出:false
解释:
前 2 位顾客那里,我们按顺序收取 2 张 5 美元的钞票。
对于接下来的 2 位顾客,我们收取一张 10 美元的钞票,然后返还 5 美元。
对于最后一位顾客,我们无法退回 15 美元,因为我们现在只有两张 10 美元的钞票。
由于不是每位顾客都得到了正确的找零,所以答案是 false。
class Solution {
    public boolean lemonadeChange(int[] bills) {
        if(bills[0] != 5) return false;
        ArrayList<Integer> arr = new ArrayList();
        arr.add(bills[0]);
        int len = bills.length;
        for(int i = 1 ; i < len; i++) {
            int tmp = bills[i] - 5;
            if(tmp == 0) {
                arr.add(bills[i]);
                continue;
            }
            if(tmp == 15) {
                arr.sort(Comparator.naturalOrder());
                if(arr.contains(10)&&arr.contains(5))  {
                    arr.remove(arr.indexOf(5));
                    arr.remove(arr.indexOf(10));
                    arr.add(bills[i]);
                } else if(arr.size()>2&&arr.get(0)==5&&arr.get(1)==5&&arr.get(2)==5) {
                    arr.remove(arr.indexOf(5));
                    arr.remove(arr.indexOf(5));
                    arr.remove(arr.indexOf(5));
                    arr.add(bills[i]);
                } 
                else {
                    return false;
                }
            } else {
                if(!arr.contains(tmp))  {
                    return false;
                } else {
                    arr.remove(arr.indexOf(tmp));
                    arr.add(bills[i]);
                }
            }
        }
        return true;
    }
}

         这道题也是一道简单题。直接模拟即可。找零的时候要注意的只有:15不止可以由10+5还可以由3张5找零,其他的只需要照常写就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值