数组的增删查改逻辑上很简单,但是作为初学者,在边界问题上很容易出错,值得注意。
1.升序的数组插入元素,有相同元素则插入到相同元素后面。先查找到对应的位置,然后将该位置以及之后的元素都后移一位,然后插入。
/// <param name="arr"></param>
/// <param name="size">数组已经存储的元素数量</param>
/// <param name="element">待插入的元素</param>
/// <returns>插入的元素的位置</returns>
public static int[] AddElement(int[] arr, int size, int element)
{
//判断数组是否已满
if (size >= arr.Length)
return arr;
//寻找应该插入的位置,注意index初始化不是0!
int index = size;
for (int i = 0; i < size; i++)
{
if (arr[i] > element)
{
index = i;
break;
}
}
//后移(思路上是把前面的元素赋值给自己)
for (int i = size; i > index; i--)//注意是size开始,不是size-1
{
arr[i] = arr[i - 1];
}
arr[index] = element;
return arr;
}
2.升序的数组移除指定元素。也是先查,后移
/// <param name="arr"></param>
/// <param name="size">数组已经存储的元素数量</param>
/// <param name="element">待移除的元素</param>
/// <returns></returns>
public static int[] RemoveElement(int[] arr, int size, int element)
{
int index = -1;
for (int i = 0; i < size; ++i)
{
if (arr[i] == element)
{
index = i;
break;
}
}
if (index == -1)
return arr;
else
{
//思路上是把我赋值给我前面的元素
for (int i = index + 1; i < size; ++i)//留意边界判断
{
arr[i - 1] = arr[i];
}
//置零
arr[size - 1] = 0;
}
return arr;
}
———————————————————————————————————————————
另外,今天学的判断数组是否单调也值得记录。
思路是,只遍历一次,判断是否存在“前面的元素比后面的元素小”,同时还存在“前面的元素比后面的元素大”,同时存在则说明不是单调数组。
public static bool isMonotonic2(int[] arr)
{
bool dec = true;
bool inc = true;
for (int i = 0; i < arr.Length - 1; i++)
{
if (arr[i] > arr[i + 1])
inc = false;
if (arr[i] < arr[i + 1])
dec = false;
}
return inc || dec;
}