开始思路----
(1)负数优先级最高,从小往大变
(2)0优先级第2,负数全变完变0
(3)正数优先级最低,最后变正数,从小往大变
#法一,暴力法,纯暴力,写了一上午我他喵,一开始想法就大概是上面的,
一,先排序从小到大,循环k次,(1)if 遇到负数取相反数,(3)elif 遇到0,直接break弹出(因为可以重复取0)(3)else 遇到正数,此时nums全为正数,判断剩余还可以转换"变身"次数,如果为奇数则sorted把第一个(最小)取负数return sum;如果为偶数,直接return sum
二,想法很好但是会出现这种情况[1,2,-3] k=5, k会超出len(nums) 就会index out of range, 所以我的对策再分两大种情况,len(nums)<k.和len(nums)>k,但是!!!他喵第一种情况我直接复制后一种代码,在全为正时又不行 。[1,2,3] k=5,里面再分,第一种情况下全为正,不全为正怎么办。
nums=sorted(nums)
count=0
if len(nums)<k: #这种情况就是跑完了len(nums),全变为正数了,但是还有变身的次数
for h in nums: #排除一个特例[1,2,3] 5 全为正len(nums)<k
if min(nums)>=0:
if k%2==0:
return sum(nums)
else:
return sum(nums)-2*min(nums)
else:
for i in range(len(nums)): #问题,非要两个for loop,不是所有的都变是当前最小的才变
if nums[i]<0:
nums[i]=-nums[i]
count=count+1
elif nums[i]==0:
break
else: #第一次的漏洞,全为正数时可以一直变一个,分奇偶两种情况就行
if (k-count)%2==0:
break
else:
nums=sorted(nums) #这边已经全是正数了把正数里面最小的一个给变了就OK
nums[0]=-nums[0]
nums=sorted(nums)
if (k-len(nums))%2==0:
return sum(nums)
else:
return sum(nums)-2*min(nums)
if len(nums)>=k: #可能会出现 [-4,-2,-3], 4, 此时i为0,1,2,3 index out of range
for i in range(k): #自己做时的问题,非要两个for loop,不是所有的都变,是当前最小的才变
if nums[i]<0:
nums[i]=-nums[i]
count=count+1
elif nums[i]==0:
break
else: #第一次的漏洞,全为正数时可以一直变一个,分奇偶两种情况就行
if (k-count)%2==0:
break
else:
nums=sorted(nums) #这边已经全是正数了把正数里面最小的一个给变了就OK
nums[0]=-nums[0]
return sum(nums)
#法2 youtube上的解法 一共循环k次,每次找到当前最小的,然后取相反数,太妙了,所有情况都含在里面了
for i in range(k):
a=nums.index(min(nums))
nums[a]=-nums[a]
return sum(nums)