一 题目:
二 思路:
- 优先把最小的负数反转为正,其次反转最小的正数
-** 代码很多可以合并的if else我为了逻辑清晰没有合并,打击凑合着看,虽然写了一坨💩**
三 代码:
public int largestSumAfterKNegations(int[] nums, int k) {
//优先把最小的负数反转为正,其次反转最小的正数
Arrays.sort(nums);
int sum=0;
Integer x=null;
for (int i = 0; i < nums.length; i++) {
x= x==null?Math.abs(nums[i]):Math.min(x,Math.abs(nums[i]));
if (k==0){
//已经到目标次数了,不需要翻转了,直接加
sum+=nums[i];
}else {
//如果还需要反转
// 还有负数
if (nums[i]<0){
//sum加这个数的整数
sum+=(-nums[i]);
k--;
}else {
//如果k是偶数相当于来回反转,不用管,直接快进到0
if (k%2==0){
k=0;
}else {
//如果是奇数,就需要让最小正数反转一次,并把之前加的需要减掉
sum-=2*(x);
k=0;
}
sum+=nums[i];
}
}
}
//如果k还是大于0,直接拷贝的上面的else逻辑,所以这里没有去掉无用的if和k,尽量让大家知道这是和上面对于富裕的k一样的逻辑
if (k>0){
//如果k是偶数相当于来回反转,不用管,直接快进到0
if (k%2==0){
k=0;
}else {
//如果是奇数,就需要让最小正数反转一次,并把之前加的需要减掉
sum-=2*(x);
k=0;
}
}
return sum;
}