输入一个整数数组和一个整数k,按以下方式修改该数组
1.选择某个下标 i 并将 nums[i] 替换为 -nums[i]
2.重复这个过程恰好 k 次。可以多次选择同一个下标 i 。
以这种方式修改数组后,返回数组可能的最大和 。
输入:nums = [4,2,3], k = 1
输出:5
解释:选择下标 1 ,nums 变为 [4,-2,3] 。
测试用例:
输入:nums = [3,-1,0,2], k = 3
输出:6
输入:nums = [2,-3,-1,5,-4], k = 2
输出:13
其中:
1 <= nums.length <= 10000
-100 <= nums[i] <= 100
1 <= k <= 10000
解题思路
代码
import java.util.Arrays;
public class day4 {
public static void main(String[] args) {
int[] nums1 = {3,-1,0,2};
System.out.println(solution(nums1,3));
int[] nums2 = {2,-3,-1,5,-4};
System.out.println(solution(nums2,2));
}
public static int solution(int[] nums,int k){
//从小到大排序,便于操作
Arrays.sort(nums);
//没有负数
if(!isNegative(nums)){
if(isZero(nums)){//存在0
return tempsum(nums);
}else{//不存在0
if(k%2==0){//变化次数是否为奇数决定加减
return tempsum(nums);
} else{
return tempsum(nums)-nums[0];
}
}
}else{//有负数
//计算数组中小于0的元素个数
int count=0;
for (int i = 0; i < nums.length; i++) {
if(nums[i]<0){
count++;
}
}
//count和k相等
if(k==count){
return tempsum(nums);
}else if(k<count){//k小于count
int sum=0;
for (int i = 0; i < nums.length; i++) {
if(i<k){//小的负数绝对值较大
sum=sum-nums[i];
}else{
sum=sum+nums[i];
}
}
return sum;
}else{//count小于k
if(isZero(nums)){//有0
return tempsum(nums);
}else{
//没有0,找最小绝对值
int min=0;
for (int i = 0; i < nums.length; i++) {
if(Math.abs(nums[i])>Math.abs(nums[i+1])){
min=Math.abs(nums[i+1]);
}
}
if((k-count)%2==0){//多余次数是否为奇数决定加减
return tempsum(nums);
}else{
return tempsum(nums)-min;
}
}
}
}
}
//是否存在0,存在返回true,不存在返回false
public static boolean isZero(int[] nums){
for (int i = 0; i < nums.length; i++) {
if(nums[i]==0) {
return true;
}
}
return false;
}
//是否存在负数,存在返回true,不存在返回false
public static boolean isNegative(int[] nums){
for (int i = 0; i < nums.length; i++) {
if(nums[i]<0) {
return true;
}
}
return false;
}
//临时求和,有负数的取反求和,没负数的正常求和
public static int tempsum(int[] nums){
int sum=0;
if(!isNegative(nums)){
for (int i = 0; i < nums.length; i++) {
sum=sum+nums[i];
}
return sum;
}else{
for (int i = 0; i < nums.length; i++) {
if(nums[i]<0){
sum=sum-nums[i];
}else{
sum=sum+nums[i];
}
}
return sum;
}
}
}
测试
ps:写了好长时间,真费脑子,大佬快给简单的解法!