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。
用这样写一下时间复杂度也是降到很低的程度:
在柠檬水摊上,每一杯柠檬水的售价为
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找零,其他的只需要照常写就可以了。