将数组拆分为两个相等的子数组,其中选择了索引
split array into two equal subarray where index is selected
我需要 return 元素的索引,其中左侧元素的总和等于右侧元素的总和。例如,对于数组 [-3, 8, 3, 1, 1, 3],return 值是索引 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));
}
您的代码有两个问题。一是变量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,因为你不想在索引本身中包含元素,而只在右侧包含元素,如果我正确理解您的代码要求。
您可以使用下面的代码来解决问题
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;
}
希望对您有所帮助。
我需要 return 元素的索引,其中左侧元素的总和等于右侧元素的总和。例如,对于数组 [-3, 8, 3, 1, 1, 3],return 值是索引 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));
}
您的代码有两个问题。一是变量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,因为你不想在索引本身中包含元素,而只在右侧包含元素,如果我正确理解您的代码要求。
您可以使用下面的代码来解决问题
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;
}
希望对您有所帮助。