码迷,mamicode.com
首页 > 编程语言 > 详细

Leecode刷题之旅-C语言/python-26.删除数组中的重复项

时间:2019-03-08 09:36:57      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:实参   2.7   algorithm   moved   应该   list   i++   拷贝   并且   

/*
 * @lc app=leetcode.cn id=26 lang=c
 *
 * [26] 删除排序数组中的重复项
 *
 * https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/description/
 *
 * algorithms
 * Easy (42.77%)
 * Total Accepted:    89.1K
 * Total Submissions: 208.1K
 * Testcase Example:  ‘[1,1,2]‘
 *
 * 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
 * 
 * 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
 * 
 * 示例 1:
 * 
 * 给定数组 nums = [1,1,2], 
 * 
 * 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 
 * 
 * 你不需要考虑数组中超出新长度后面的元素。
 * 
 * 示例 2:
 * 
 * 给定 nums = [0,0,1,1,1,2,2,3,3,4],
 * 
 * 函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
 * 
 * 你不需要考虑数组中超出新长度后面的元素。
 * 
 * 
 * 说明:
 * 
 * 为什么返回数值是整数,但输出的答案是数组呢?
 * 
 * 请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
 * 
 * 你可以想象内部操作如下:
 * 
 * // nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
 * int len = removeDuplicates(nums);
 * 
 * // 在函数里修改输入数组对于调用者是可见的。
 * // 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
 * for (int i = 0; i < len; i++) {
 * print(nums[i]);
 * }
 * 
 * 
 */
int removeDuplicates(int* nums, int numsSize) {

    if(numsSize==0){ 
        return 0;    
    }    
    int length = 0;    
    for(int i=0;i<numsSize;i++)
    {        
        if(nums[i]!=nums[length])
        {            
            length++;
            nums[length]=nums[i];        
            }    
    }    
    length+=1;
    return length;
}

这里判断如果数组为空,那么返回长度为0.

设置一个length变量为0,用于记录不同值的个数。

在数组中循环,如果循环到的值不等于num[length] 实际上可以理解为 num[length]为数组的第一个数,找到和第一个数不同的数,就把length+1 然后把数存放到num[length+1]中。

之后的以此类推。因为题目中说了不需要管那些超出长度的,所以这种方法会把不一样的数一个个的存放进来,最后得到的length 是数组中可寻址的最大长度,若要返回整个数组的长度就需要把 length+1.

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

python:

#
# @lc app=leetcode.cn id=26 lang=python3
#
# [26] 删除排序数组中的重复项
#
# https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/description/
#
# algorithms
# Easy (42.77%)
# Total Accepted:    89.1K
# Total Submissions: 208.1K
# Testcase Example:  ‘[1,1,2]‘
#
# 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
# 
# 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
# 
# 示例 1:
# 
# 给定数组 nums = [1,1,2], 
# 
# 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 
# 
# 你不需要考虑数组中超出新长度后面的元素。
# 
# 示例 2:
# 
# 给定 nums = [0,0,1,1,1,2,2,3,3,4],
# 
# 函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
# 
# 你不需要考虑数组中超出新长度后面的元素。
# 
# 
# 说明:
# 
# 为什么返回数值是整数,但输出的答案是数组呢?
# 
# 请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
# 
# 你可以想象内部操作如下:
# 
# // nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
# int len = removeDuplicates(nums);
# 
# // 在函数里修改输入数组对于调用者是可见的。
# // 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
# for (int i = 0; i < len; i++) {
# print(nums[i]);
# }
# 
# 
#
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        if len(nums)<=1:
           return len(nums)
        s=0
        for f in range(1,len(nums)):
            if nums[s]!=nums[f]:
                s+=1
                nums[s]=nums[f]
        return s+1

 

Leecode刷题之旅-C语言/python-26.删除数组中的重复项

标签:实参   2.7   algorithm   moved   应该   list   i++   拷贝   并且   

原文地址:https://www.cnblogs.com/lixiaoyao123/p/10493649.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!