笔试题39. LeetCode OJ (26)
2016-04-26 17:31
190 查看
这个题目的意思是给你一个数组,删除里面重复的数字,然后返回数组的长度。第一反应是它很简单,不过还是调试了几次才写出来的,确实是一个循环就能解决的问题,不过我觉得其中还是需要注意一下东西:
1.先找到第一次出现相同的位置,这样方便解题(我是按照我下面的代码来说明的,当然你可能会有别的方法)
2.遇到相同元素时,记录第一次出现的位置prev,然后找到不是这个元素时停止,将这个元素加入到不重复序列中
3.想一想还有这样一种情况,就是前面有一些元素不同,但是突然出现了相同元素,这个时候需要注意代码的控制,否则最后的结果可能会出现重复的数字,我们应该将这个特殊数字加入到不重复序列后,再移动cur,使其和前面的序列不重复为止。
综上,代码如下:
class Solution { public: int removeDuplicates(vector<int>& nums) { /* 1.不准备额外使用空间 2.返回删除重复节点后的数组长度 3.数组有序 */ int len = nums.size(); if(len == 0 || len == 1) { return len; } int only = 0; // 用于记录不重复的下标,最后该下标以及以前的部分都是only one int prev = 0; int cur = 1; //用于遍历 //找出前面不相同的序列 while(cur<len && nums[only] != nums[cur]) { ++cur; ++only; } if(cur == len) { return only+1; } while(cur < len) { if(nums[cur] == nums[cur-1]) { prev = cur-1; while(cur<len && nums[prev] == nums[cur]) { ++cur; } nums[only++] = nums[prev]; } else { nums[only++] = nums[cur++]; while(cur < len && nums[cur] == nums[cur-1]) { ++cur; } } } return only; } };
相关文章推荐
- Firefox extension 开发之常用XPCOM service
- 作业6-学生成绩录入
- 单例模式的懒汉式和饿汉式实现分析
- RestSharp使用备忘
- 记住密码超简单实现(C#)
- centos7 开启防火墙端口 firewalld
- CArray排序
- oncreate()方法中获得view宽高 观察者模式
- DLL动态链接库的是如何建立的(1)
- Zookeeper 的学习与运用
- 关于开发工具的一些快捷键收集(持续更新)
- 类似UC浏览器三个圆点加载控件
- 修改eclipse自动生成的comments中的author名字
- ITS信号控制系统渠化图自动生成
- 算法题:Zipper
- c++第四次作业
- Android 开发 voip/sip 程序
- Python笔记(1)变量与表达式
- Oracle Golden Gate - 概念和机制 (ogg)
- 编程语言及其应用