数组元素的移动(删除) C#实现
下面有四个问题:
- 把数组元素前后部分交换 MoveFirstPartOfArrayToTheEnd(int[] array, int index) 比如 {1,2,3,4,5,6,7} 3 => {4,5,6,7,1,2,3}
- 把数组元素前后部分交换 MoveFirstPartOfArrayToTheEnd(int[] array, int value)比如 {1,2,8,4,5,6,7} 8 => {4,5,6,7,1,2,8}
- 把数组一段移动到后面MoveSomeElementsToTheEnd(int[] array, int startIndex, int length)比如{1,2,3,4,5,6,7,8} 3 3 => {1,2,3,7,8,4,5,6}
- 把数组中重复的元素变成0放到最后面RemoveDulplicatedElements(int[] array) 比如 {1,3,3,2,4,4,4,5} => {1,3,2,4,5,0,0,0}
你首先想到的办法是什么?
- 申请一个临时数组把FistPart和EndPart交换
- 同上,只要找到对应值的下标即可。
- 同上申请临时数组,把要移动的段放到临时数组里
- 申请一个临时的List<int>把唯一的元素加到List里面,再重新赋给Array。
class Program
{
static void Main(string[] args)
{
//
int[] array1 = { , , , , , , };
MoveFirstPartOfArrayToTheEnd(array1, );
printArray(array1); //
int[] array2 = { , , , , , , };
MoveFirstPartOfArrayToTheEndValue(array2, );
printArray(array2); //
int[] array3 = { , , , , , , , };
MoveSomeElementsToTheEnd(array3, , );
printArray(array3); //
int[] array4 = { , , , , , , , };
removeDulplicatedElements(array4);
printArray(array4); } private static void printArray(int[] array)
{
for (int i = ; i < array.Length; i++)
{
Console.Write(array[i]);
}
Console.WriteLine();
} public static void MoveFirstPartOfArrayToTheEnd(int[] array, int index)
{
if (index >= array.Length || index <= )
{
throw new Exception("index must be greater than 0 and less than " + array.Length);
} //Move the first part of array to a temp array
int[] temp = new int[index];
for (int i = ; i < index; i++)
{
temp[i] = array[i];
} //Move forward the other element
for (int i = ; i < array.Length - index; i++)
{
array[i] = array[i + index];
} //Move the first part back to the end of array
int j = ;
for (int i = array.Length - index; i < array.Length; i++)
{
array[i] = temp[j];
j++;
}
} public static void MoveFirstPartOfArrayToTheEndValue(int[] array, int value)
{
bool move = false; //Search the value in the array
for (int i = ; i < array.Length; i++)
{
if (array[i] == value)
{ //Move the first part if we find the value
MoveFirstPartOfArrayToTheEnd(array, i + );
move = true;
break;
}
} if (!move)
{
throw new Exception("No matched value is found in the array");
}
} public static void MoveSomeElementsToTheEnd(int[] array, int startIndex, int length)
{
if (startIndex < || startIndex >= array.Length - )
{
throw new Exception("startIndex must be greater than 0 and less than " + (array.Length - ).ToString());
} if (startIndex + length + > array.Length)
{
throw new Exception("Please provide a valid length");
} int[] temp = new int[length];
for (int i = ; i < temp.Length; i++)
{
temp[i] = array[startIndex + i];
} //Move forward the other element
for (int i = startIndex; i < array.Length - length; i++)
{
array[i] = array[i + length];
} //Move the first part back to the end of array
int k = ;
for (int i = array.Length - length; i < array.Length; i++)
{
array[i] = temp[k];
k++;
}
} public static void removeDulplicatedElements(int[] array)
{
List<int> temp = new List<int>();
for (int i = ; i < array.Length; i++)
{
if (array[i] == )
continue;
temp.Add(array[i]);
for (int j = i + ; j < array.Length; j++)
{
if (array[i] == array[j])
{
array[j] = ;
}
}
} for (int i = ; i < array.Length; i++)
{
if (i < temp.Count)
{
array[i] = temp[i];
}
else
{
array[i] = ;
}
}
}
}
现在要求优化算法,空间复杂度为O(1),该如何去优化呢?
- 我们先看{1,2,3,4,5,6,7}3如何变成{4,5,6,7,1,2,3}的,首先前后部分各自反转变成{3,2,1,7,6,5,4}然后再把整个数组反转就变成了{4,5,6,7,1,2,3}。
- 同上,只要找到对应值的下标即可。
- 我们再看{1,2,3,4,5,6,7,8} 3 3 => {1,2,3,7,8,4,5,6}过程,前面不动的部分{1,2,3}先不管,且看后面{4,5,6,7,8}=>{7,8,4,5,6},同上面,各自反转尔后整体反转{6,5,4,8,7}=>{7,8,4,5,6}
- {1,3,3,2,4,4,4,5} => {1,3,2,4,5,0,0,0}的过程,先把重复的元素变成0,再依次移动到最后,{1,3,3,2,4,4,4,5} => {1,3,0,2,4,0,0,5}=>{1,3,2,4,0,0,5,0}=>{1,3,2,4,0,5,0,0}=>{1,3,2,4,5,0,0,0}
从上面可以看出都用到了一个通用的方法就是反转数组ReversArray().这个操作只需要申请一个临时变量。即空间复杂度为O(1)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace TransposeArray
{
class Program
{
static void Main(string[] args)
{
//1 {1,2,3,4,5,6,7} 3 => {4,5,6,7,1,2,3}
int[] Array1 = new int[] { , , , , , , };
TransposeByIndex(Array1, );
PrintArray(Array1);
//2 {1,2,8,4,5,6,7} 8 => {4,5,6,7,1,2,8}
int[] Array2 = new int[] { , , , , , , };
TransposeByValue(Array2, );
PrintArray(Array2);
//3 {1,2,3,4,5,6,7,8} 3 3 => {1,2,3,7,8,4,5,6}
int[] Array3 = new int[] { , , , , , , , };
TransposeBySegment(Array3, , );
PrintArray(Array3);
//4 {1,3,3,2,4,4,4,5} => {1,3,2,4,5,0,0,0}
int[] Array4 = new int[] { , , , , , , , };
RemoveDuplicated(Array4);
PrintArray(Array4);
} //Print the array.
public static void PrintArray(int[] array)
{
for (int i = ; i < array.Length; i++)
{
Console.Write(array[i] + ", "); }
Console.ReadLine();
} // Reverse an Array
public static void ReverseArray(int[] array, int left, int right)
{ for (; left < right; ++left, --right)
{
int tmp = array[left];
array[left] = array[right];
array[right] = tmp;
}
} // Reverse thrice respectively.
public static void TransposeByIndex(int[] array, int index)
{
ReverseArray(array, , index);
ReverseArray(array, index + , array.Length - );
ReverseArray(array, , array.Length - );
} //Transpose by value
public static void TransposeByValue(int[] array, int value)
{
for (int i = ; i < array.Length; i++)
if (array[i] == value)
{
TransposeByIndex(array, i);
}
} //Tanspose by segment
public static void TransposeBySegment(int[] array, int StartIndex, int Length)
{
int div = StartIndex + Length - ;
int end = array.Length - ;
ReverseArray(array, StartIndex, div);
ReverseArray(array, div + , end);
ReverseArray(array, StartIndex, end);
} //Romove duplicated Elements
public static void RemoveDuplicated(int[] array)
{
for (int i = array.Length - ; i > ; i--)
{
for (int j = ; j < i; j++)
{
if (array[i] == array[j])
{
array[i] = ;
}
} } for (int i = ; i < array.Length - ; i++)
{
for (int j = array.Length - ; j > i; j--)
{
if (array[i] == && array[j] != )
{
ReverseArray(array, i, j);
ReverseArray(array, i, j - );
}
}
} }
}
}
第4个问题可以用其他方法实现,不去调用ReversArray方法。
找到重复元素置为0,然后搜索为0的值,再把后面的元素前移,最后一个元素置0。空间复杂度也为O(1)
数组元素的移动(删除) C#实现的更多相关文章
- PTA 数组元素的区间删除
6-6 数组元素的区间删除 (20 分) 给定一个顺序存储的线性表,请设计一个函数删除所有值大于min而且小于max的元素.删除后表中剩余元素保持顺序存储,并且相对位置不能改变. 函数接口定义: ...
- java 在循环中删除数组元素
在写代码中经常会遇到需要在数组循环中删除数组元素的情况,但删除会导致数组长度变化. package com.fortunedr.thirdReport; import java.util.ArrayL ...
- JS数组方法汇总 array数组元素的添加和删除
js数组元素的添加和删除一直比较迷惑,今天终于找到详细说明的资料了,先给个我测试的代码^-^ var arr = new Array(); arr[0] = "aaa"; arr[ ...
- 几种php 删除数组元素方法
几种php教程 删除数组元素方法在很多情况下我们的数组会出现重复情况,那我们删除数组中一些重复的内容怎么办,这些元素我必须保持他唯一,所以就想办法来删除它们,下面利用了遍历查询来删除重复数组元素的几种 ...
- Javascript:splice()方法实现对数组元素的插入、删除、替换及去重
定义和用法 splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目. 注释:该方法会改变原始数组. 语法: Array.prototype.splice(index,count[,el ...
- javascript 常见数组操作( 1、数组整体元素修改 2、 数组筛选 3、jquery 元素转数组 4、获取两个数组中相同部分或者不同部分 5、数组去重并倒序排序 6、数组排序 7、数组截取slice 8、数组插入、删除splice(需明确位置) 9、数组遍历 10、jQuery根据元素值删除数组元素的方)
主要内容: 1.数组整体元素修改 2. 数组筛选 3.jquery 元素转数组 4.获取两个数组中相同部分或者不同部分 5.数组去重并倒序排序 6.数组排序 7.数组截取slice 8.数组插入.删除 ...
- jQuery根据元素值或元素下标来删除一个数组元素及数组对象方法列表
在前提不知道b在这个数组的下标,删除b这个元素 var arrList = ['a','b','c','d']; arrList.splice(jQuery.inArray('b', ...
- js删除数组元素
一.清空数组 var ary = [1,2,3,4]; ary.splice(0,ary.length);//清空数组 console.log(ary); // 输出 [],空数组,即被清空了 二.删 ...
- js删除数组元素、清空数组的简单方法
一.清空数组 ? 1 2 3 var ary = [1,2,3,4]; ary.splice(0,ary.length);//清空数组 console.log(ary); // 输出 [],空数组,即 ...
随机推荐
- Android四种数据存储方式
一.SharedPreference数据存储篇 1.作用范围 (1).它是一种轻型的数据存储方式 (2).本质是基于XML文件存储key-value键值对数据 (3).通常用来存储一些简单的配置方式 ...
- LOJ#2052. 「HNOI2016」矿区(平面图转对偶图)
题面 传送门 题解 总算会平面图转对偶图了-- 首先我们把无向边拆成两条单向边,这样的话每条边都属于一个面.然后把以每一个点为起点的边按极角排序,那么对于一条边\((u,v)\),我们在所有以\(v\ ...
- APP间传递消息
https://www.jianshu.com/p/d640ccfcea5f 1: URL Scheme 常用的App间传值方式.常见于分享等. 2: Keychain 借助系统类 Keychain ...
- robot_framework Authorization 解决登录超时问题(token)
写rf的接口时,遇到总是报错提示: 登录超时 解决过程: 1 . 通过对同一个接口进行手机抓包对比,发现该接口请求时,多了Authorization,需要HTTP Basic Authenticati ...
- [Swift实际操作]七、常见概念-(8)日历Calendar和时区TimerZone
本文将为你演示日历的一些属性,以及如何利用日历,查询是否为昨天.今天和明天. 首先引入需要用到的界面工具框架 import UIKit 然后生成一个日历对象,并获得用户当前的日历. var calen ...
- Google 团队效能研究 | 为什么雇用最聪明的人是远远不够的?
简评:Google 的一项团队效能研究结果,可能会让你重新认识如何建立一个优秀的团队. Google 的搜索业务可能最为人所知,但 Google 可不仅仅有搜索业务,它可能还是最擅于大数据研究的公司之 ...
- 利用 URLProtocol 假冒一个服务器来测试网络
制造一个假的服务器 class MockURLProtocol: URLProtocol { static var requestHandler: ((URLRequest) throws -> ...
- day 43 mysql 学习 以及pymysql 学习
前情提要: 本次主要学习sql 的难点, 多表查询以及连接python 一:多表关联 >多表查询的缺点 二:单表的连表查询[自关联查询] 三:子查询 >主查询 >主查询 >主 ...
- POJ 2242
#include <iostream> #include <cmath> #include <iomanip> using namespace std; #defi ...
- Springboot 打jar包分离lib,配置文件正确方式(二)
Springboot 打jar包分离lib,配置文件正确方式(二) 背景 从<Springboot 打jar包分离lib,配置文件正确方式>中,可以达到把配置文件和依赖第三方的jar包分离 ...