算法通关村 | 第三关青铜——不简单的数组增删查改

数组的增删查改逻辑上很简单,但是作为初学者,在边界问题上很容易出错,值得注意。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值