1.实现一个函数 凑14 :输入很多个整数(1<=数值<=13)任意两个数相加等于14就可以从数组中删除这两个数,求剩余数(从小到大排列);比如输入{9,1,9,7,5,13 } 输出 {7,9};
用两个指针变量一头一尾,同时遍历,可以避免访问重复数据,遇到相同的就将其下标保存在list中,最后通过数组和list进行去重复,然后返回最终结果。
代码如下:
//凑14
public static int[] RemoveBy14(int[] arr) {
if (arr.Length < 2) return arr;
Array.Sort(arr);
int i = 0;
int j = arr.Length - 1;
//保存数组中和为14的下标
List<int> target = new List<int>();
//左右指针同时遍历避免重复访问同一数据
while (i < j) {
if (arr[i] + arr[j] > 14)
{
j--;
}
else if (arr[i] + arr[j] < 14)
{
i++;
}
else {
target.Add(i);
target.Add(j);
i++;
j--;
}
}
//保存最终返回的数据
List<int> new_arr = new List<int>();
for (int k = 0; k < arr.Length; k++) {
bool flag = true;
foreach (int z in target) {
if (k == z) flag = false;
}
if(flag) new_arr.Add(arr[k]);
}
return new_arr.ToArray();
}
2.实现一个函数:压缩由0和1组成的数组,去除连续重复;如:输入{1,0,0,1,1,1,1,0},输出{1,0,1,0};
代码如下:
public static int[] RemoveRepeat(int[] arr) {
if (arr.Length <= 1) return arr;
List<int> list = new List<int>();
list.Add(arr[0]);
for (int i = 1; i < arr.Length ; i++) {
if (arr[i] == arr[i - 1])
{
continue;
}
else {
list.Add(arr[i]);
}
}
return list.ToArray();
}