想象一下,我有一个像这样的数组{7, 2, 8, 9, 4, 13, 7, 1, 9, 10}
我想要这个数组{9, 17, 17, 8, 19}
。
原始列表中的第一对折叠为9(7 + 2),第二对折叠为17(8 + 9),依此类推。
我的问题是如何在C#中调整初始数组的大小?
我不想使用另一个具有初始数组一半大小的数组,并且我不能使用List。
答案 0 :(得分:2)
唯一可以调整数组大小的方法是Array.Resize()。但是,如备注所述:
此方法分配具有指定大小的新数组,将元素从旧数组复制到新数组,然后用新数组替换旧数组。
实际上不可能表达您的要求。
现在我们可以质疑原因了。为什么不想要另一个数组?
您可以用此阵列替换旧阵列,垃圾收集器将负责清洁旧阵列。但这与使用Resize()方法相同。
您可以使用列表<>,但是显然不能。您能详细说明为什么吗? List <>在所有.Net框架和库中均可用。
根据您的要求,它看起来很像XY Problem
答案 1 :(得分:1)
您无法使用C#调整初始数组的大小。 C#中的Arrays不可调整大小。 https://docs.microsoft.com/en-us/dotnet/api/system.array?view=netframework-4.7.2
int[] array = { 7, 2, 8, 9, 4, 13, 7, 1, 9, 10 };
您无法调整此数组的大小。
答案 2 :(得分:1)
请假评论this code example。
似乎您需要使用Array.Resize
方法(MSDN链接为here)。
代码段:
var arr = int[10] {7, 2, 8, 9, 4, 13, 7, 1, 9, 10};
for (int i=0; i<5; i++)
{
arr[i]=arr[i] + arr[i+1];
}
Array.Resize(ref arr, 5);
答案 3 :(得分:1)
我仅使用数组编写了一个简单的实现。首先,我们遍历数组,然后每隔两个元素执行一次求和。然后删除第二个元素,并在其位置放一个标志(-1000)。
然后我将简单的逻辑用于冒泡排序算法,但只有在找到我们的标志时才进行交换。因此,我们所有的总和都在数组的左侧,而标志在右侧。
然后我使用Take方法获取一半的结果。
int flag = -1000;
int[] myValues = new int[] { 7, 2, 8, 9, 4, 13, 7, 1, 9, 10 };
for (int i = 0; i < myValues.Length; i++)
{
if (i % 2 != 0 && i != 0)
{
myValues[i - 1] = myValues[i] + myValues[i - 1];
myValues[i] = flag;
}
}
//clean up remove unwanted flags
for (int i = 0; i < myValues.Length; i++)
{
for (int j = i + 1; j < myValues.Length; j++)
{
if (myValues[i] == flag)
{
var temp = myValues[j];
myValues[j] = myValues[i];
myValues[i] = temp;
}
}
}
myValues = myValues.Take(myValues.Length / 2).ToArray();
答案 4 :(得分:-1)
在位置i上放置ith和i + 1元素的和,在i + 1处删除元素,重复。
private static List<int> solution(List<int> arr) {
int s = arr.Count;
for (int i = 0; i < s; i += 1) {
arr[i] = arr[i] + arr[i + 1];
arr.RemoveAt(i + 1);
s -= 1;
}
return arr;
}