【问题标题】:split array into two equal subarray where index is selected将数组拆分为两个相等的子数组,其中选择了索引
【发布时间】:2019-11-30 10:16:43
【问题描述】:

我需要返回元素的索引,其中左侧元素的总和等于右侧元素的总和。例如,对于数组 [-3, 8, 3, 1, 1, 3],返回值为索引 2,因为前 3 ([-3, 8]) 左侧元素的总和与右侧元素的总和 ([1, 1, 3])。

所以我开始使用线性搜索功能来查找预期的索引, 然后之后我尝试拆分所选索引的左右数组,但没有成功

我没有成功让它工作

//linear-search portion,x is the index selected to be split point
public static int findindex(int arr[], int x) {
//if array is null  
if (arr == null) {
        return -1;
    }
//find array length
int len = arr.length;
int i = 0;
//traverse the array
while (i < len) {
//if the i-th element is is x then return the index
    if (arr[i] == x) {
        return i;
    } else {
        i = i + 1;
    }
}
//splint array portion,returns index if not possible
int leftsum = 0;
//treverse array elements
for (int i = 0; i < x; i++) {
//adds current elements to left
    leftsum += arr[i];
//find sum of remader the array elements to rightsum
    int rightsum = 0;
    for (int j = i + 1; j < x; J++)
        rightsum += arr[j];
//split pint index
    if (leftsum == rightsum)
        return i + 1;
}
//if not possible return
return -1;
}

// driver code
public static void main(String[] args) {
    int[] array1 = { -3, 8, 3, 1, 1, 3 };
    System.out.println(findindex(array1));
}

【问题讨论】:

  • edit您的问题并缩进代码以便我们阅读。
  • 请阅读“如何创建minimal reproducible example”。然后使用edit 链接改进您的问题(不要通过 cmets 添加更多信息)。否则我们无法回答您的问题并为您提供帮助。 “但没有成功”不是有效的问题描述。是的:您希望其他人利用他们的空闲时间来帮助您解决问题,因此请花几分钟时间来正确格式化/删除您的所有输入。
  • 什么是int x作为findindex方法的参数?
  • int x 是索引点,将数组分成两等份

标签: java arrays sub-array


【解决方案1】:

您可以使用以下代码解决问题

static void Main(string[] args)
        {
            int[] array1 = {-3, 8, 3, 1, 1, 3}; // { -3, 8, 3, 1, 1, 3, 6, 1, 19 };
            int indexPosition = GetIndex(array1);
            if (indexPosition != -1)
            {
                Console.WriteLine(indexPosition);
            }
        }

        static int GetIndex(int[] param)
        {
            if (param.Length < 0) return -1;
            int leftSum = 0, rightSum = 0; int rightIndex = param.Length - 1;
            for (int i = 0; i < param.Length; i++)
            {
                if (i < rightIndex)
                {
                    if (leftSum > rightSum)
                    {
                        rightSum += param[rightIndex];
                        rightIndex -= 1;
                    }
                    else
                    {
                        if (i < rightIndex)
                        {
                            leftSum += param[i];
                        }
                    }
                }
                else
                {
                    rightSum += param[rightIndex]; // if you are looking for only index position you can comment this line,
                    //variable rightSum and leftSum will give you the sum of left and right side of the array
                    rightIndex -= 1;
                    break;
                }
            }

            return rightIndex;
        }

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    您的代码有两个问题。一是变量 i 在同一方法中定义了两次。另一个问题是您只提供一个输入参数而不是两个。我什至不知道参数 x 应该是什么,因此也将它从我的改进版本中删除。我还删除了 while 循环,因为我不明白你在那里试图做什么。无论如何,这是我的代码版本:

    public static int findindex(int arr[]) {
        if (arr == null) {
            return -1;
        }
    
        int len = arr.length;
        int leftsum = 0;
        for(int i = 0; i < len; i++)
        {
            leftsum += arr[i];
            int rightsum = 0;
            for(int j = i+2; j < len; j++)
                rightsum += arr[j];
            if(leftsum == rightsum)
                return i+1;
        }
        return -1;
    }
    
    public static void main(String[] args) {
        int[] array1 = {-3, 8, 3, 1, 1, 3};
        System.out.println(findindex(array1));
    }
    

    当我从您的代码中删除所有不必要的内容时,唯一的错误是您应该使用 i+2 初始化 j,因为如果我理解的话,您不想在索引本身包含元素而只包含在右侧您的代码要求正确。

    【讨论】:

      猜你喜欢
      • 2020-09-13
      • 2017-03-09
      • 2012-04-12
      • 2012-09-06
      • 2011-10-15
      • 2021-05-25
      • 1970-01-01
      • 2022-11-12
      • 2012-04-13
      相关资源
      最近更新 更多