1217. 玩筹码
题意:把筹码(就是芯片😐)移到一个位置需要付出的代价,其中,奇数移到奇数不用钱,偶数同理;奇偶之间每移动一个筹码一块钱。
思路:规律题
①奇数都能移到同一个奇数a上,无需花费
②偶数都能移到同一个偶数b上,无需花费
③最终的消耗,就是a上的筹码数量(奇数个数)和b上的筹码数量(偶数个数)的最小值,因为我们只需要将数量小的移动到数量多的即可。
class Solution {
public int minCostToMoveChips(int[] position) {
int aSum = 0;
int bSum = 0;
for(int p : position) {
if((p & 1)== 0) {
aSum++;
} else {
bSum++;
}
}
return Math.min(aSum, bSum);
}
}
面试题 17.04. 消失的数字
思路:规律题
由于题目已经告诉我们数组为nums为0-n,只是里面少了一个数,那只需要求0-n的和减去nums数组的和,就可以得到那个缺失的数。
class Solution {
public int missingNumber(int[] nums) {
int len=nums.length;
int sum=len;
for(int i=0;i<len;i++){
sum+=i;
sum-=nums[i];
}
return sum;
}
}
其它思路:哈希表/位运算
用哈希表统计,出现次数为0的则为缺失的数。
位运算的异或运算,与0异或结果为本身,与本身异或为0
122. 买卖股票的最佳时机 II
思路:规律题
当股票上涨时,就是购买的时机,下降前就是出售的时机。所以我们只需要求解股票上涨的区间就可以了。例如[7,1,5,3,6,4],股票上涨区间有[1,5]和[3,6],所以答案就是这些递增区间的和,即(5-1)+(6-3)
class Solution {
public int maxProfit(int[] prices) {
int len = prices.length - 1;
int res = 0;
//求递增区间
for(int i=0;i<len;i++) {
while(i<len && prices[i]>=prices[i+1]) i++; //过滤递减
int choose = i; //购买时机
while(i<len && prices[i]<prices[i+1]) i++; //过滤递增
if(i<=len) res += (prices[i] - prices[choose]); //出售时机
}
return res;
}
}
1221. 分割平衡字符串
思路:计数
R数量等于L的数量就算一个。
class Solution {
public int balancedStringSplit(String s) {
int len=s.length();
int res=0; //结果
int count=0; //计数
for(int i=0;i<len;i++){
if(s.charAt(i)=='R') count++;
else count--;
if(count==0){
res++;
}
}
return res;
}
}