• 删除一个有序数组中的重复元素


    题目来自leetcode初级算法的数组

    • 方案一

    因为这个数组是有序的,所以删除的时候可以这样做。使用最小数字减去1来标记作为被删除掉的元素。然后再把数组中的有效元素移动位置就可以了。使用C语言实现如下:

    int removeDuplicates(int* nums, int numsSize) {
        int temp = nums[0];
    	int count = 1;
    	int j;
        if(0 == numsSize)                //若没有数组,则返回0
        {
            count = 0;
        }
    	else
        {
            for (int i = 1; i < numsSize; i++)
    	{
    		if (temp == nums[i])
    		{
    			nums[i] = nums[0] - 1;	//标记删除
    		}
    		else
    		{
    			temp = nums[i];
    			count++;                //纪录删除后的元素个数
    		}
    	}
    	for (int i = 1; i < numsSize; i++)
    	{
    		if (nums[0] - 1 == nums[i]) //删除掉的元素
    		{
    			for (j = i + 1; nums[0] - 1 == nums[j] && j < numsSize; j++);//下一个有效元素
    			if (nums[0] - 1 != nums[j] && j < numsSize)
    			{
    				nums[i] = nums[j]; //移动它
    				nums[j] = nums[0] - 1;//删除它
    			}
    		}
    	}
        }
    	return count;
    }

    这样做其实比较麻烦的。我提交了之后看了一下解法,使用的办法比较简单。

    • 方案二

    只去看它后面的元素是否有和它相同,若有相同则把该元素移动到当前位置的下一个位置即可。然后继续向后找看是否有相同的元素。该算法也是简单的,比较易理解的。

    int removeDuplicates(int* nums, int numsSize) {
        int i = 1;
        if(0 == numsSize)
        {
            i = 0;
        }
        else
        {
            for(int j = 1; j < numsSize; j++)
            {
                if(nums[j] != nums[i])
                {
                    i++;
                    nums[i] = nums[j];
                }
            }
        }
        return i;
    }
  • 相关阅读:
    阿里云遇到的坑:CentOS7防火墙(Firewalld),你关了吗?
    阿里云学生机——Mysql配置---教小白入门篇
    关于Javac编译器的那点事(一)
    B树,B+树,B*树简介
    ArrayList动态扩容机制
    满二叉树和完全二叉树
    nginx实践(二)之静态资源web服务(浏览器缓存场景)
    http之cdn介绍
    http之理解304
    nginx实践(一)之静态资源web服务
  • 原文地址:https://www.cnblogs.com/zy666/p/10504306.html
Copyright © 2020-2023  润新知