-----------------------------------2019/1/28--------------------------------------
原题链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/
今天重新写了一下,这个题属于简单的,用时15min.
通过百度学到了System.Array.Resize(ref nums,p); 可以重新定义nums数组的大小。
public class Solution {
public int RemoveDuplicates(int[] nums) {
int p = 0;
HashSet<int> set = new HashSet<int>();
for (int i = 0; i < nums.Length; i++)
{
if (!set.Contains(nums[i]))
{
set.Add(nums[i]);
nums[p] = nums[i];
p++;
}
}
System.Array.Resize(ref nums,p);
return p;
}
}
下面是以前写的,当时不会hash所以写的很复杂:
-----------------------------------2019/1/28--------------------------------------
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
我的思路: 1,定义一个标识[number] ———— int number=0;
2,仅循环一次数组,在原数组上【i】,判断标识number位置的值与for循环的【i】如果值不同。将【i】的值赋值给更新数组的【number】
0、0、1、1、2、3、4、4
00112344 [0] 0 与 0 比,一样,for循环 i ++
00112344 [1] i=1的0 和 0 比相同 ,i++
01112344 [2] 当i=2(绿)的时候, 将 当前的 i 赋值给 number++(红),从而组建一个新的数组。
01112344 [3]
01212344 [4]
01232344 [5]
01234344 [6] 01234-344 此时number=4 (+1 =5为【01234】 作为return值)
c# 代码如下:
private static int Cgs(int[] nums)
{
int number = 0;
for (int i = 0; i < nums.Length; i++)
{
if (nums[i] != nums[number])
{
number++;
nums[number] = nums[i];
}
}
number += 1;
return number;
}
static void Main(string[] args)
{
int[] nums = new int[] { 0, 0, 1, 1, 2, 3, 4, 4 };
int tt = Cgs(nums);
Console.WriteLine(tt);
Console.ReadKey();
}
得出结果为 : 5
但是并未做到删除,只是做到了修改数组和返回数组长度。