两道题目——凑14和压缩0和1组成的数组

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();
        }

猜你喜欢

转载自blog.csdn.net/m0_37845126/article/details/82962576