题目
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
解题
//第一种运用set数组
func removeDuplicates(_ nums: inout [Int]) -> Int {
if nums.isEmpty { return 0 }
let set = Set(nums)
nums = Array(set)
nums.sort()
return nums.count
}
//使用双指针算法
func removeDuplicates(_ nums: inout [Int]) -> Int {
if nums.count == 0 {
return 0
}
nums.sort()
var result = 0
for i in 1 ..< nums.count {
if nums[i] != nums[result] {
result += 1
nums[i] = nums[result]
}
}
return result+1
}
//去掉重复选项
func removeDuplicates2(_ nums: inout [Int]) -> Int {
if nums.count==0 || nums.count==1 {
return nums.count
}
nums.sort()
var index = 0
while (index != nums.count-1){
if nums[index]==nums[index+1] {
nums.remove(at: index) //nums的元素减去1,知道相等退出循环
}else {
index = index + 1
}
}
print(nums)
return nums.count;
}
var math = [2,1,2,3,44,6,32,7] // 我给的是无序数组,因此在代码中排序了一次
removeDuplicates2(&math)
总结
- 双指针算法:
- 必须在有序数组中才有效
- 并没有删除元素,而是替代值的方式(后一项的值等于前一项的值) 2.用while的方式去掉重复项:
- 删除重复项,当index = nums.count-1 退出循环