现在本人是一名大一电子信息工程专业学生,也是刚刚了解算法的重要性。我的学长告诉我以后学习可以发文章记录一下学习的经历,
是一种记笔记的方式,同时也会反映学习的情况, 本人文笔不好,希望未来的我能看懂我现在写的日记。大一空余时间不多,只能慢慢找时间
练习,希望以后能有更多的时间学习算法。
算法练习网站: 力扣(LeetCode)https://leetcode-cn.com/ 和我一样想学习算法的同学们也可以使用以下,有比较多的算法题目可以练习。
第一次练习算法我是从简单的算法开始练起 题目叫:删除排序数组中的重复项 要求如下:
一个数组nums,原地删除重复的元素使每一个元素只出现一次,同时返回数组的长度,不要使用额外的数组空间同时使用空间为O(1);
注:数组已按升序排列;
由于不使用额外的数组空间 标签中写明了指针,应使用两个指针,一个指针point2用于遍历所有元素,另一个指针point1用于比较是否重复;
指针point2指向一个元素 然后与指针point1所指向的元素进行比较,如果不同泽将point1所指向的元素进行替换,然后point1指向下一个元素。
我第一次的代码编写如下
class Solution {
public int removeDuplicates(int[] nums) {
int n = nums.length;//数组长度
int point1 = 0,point2 = 0;
while(point2 < n){
if(nums[point1] != nums[point2]){
nums[point1] = nums[point2]; //将不同元素进行赋值
point1++;//指向下一个元素
}
point2++;
}
return point1;
}
}
出现了如下问题:
输入 [1,1,2]
输出 [2]
预期结果 [1,2]
结果并不符合预期,重新思考,应该是point2所指向的元素与point1所指向的元素进行比较,如果不同,则先让指针指向下一个元素,然后将point2所指向的元素赋值给point1
同时由于point1是从0开始的,结束的数组长度应该是point1+1。修改过后的代码如下
class Solution {
public int removeDuplicates(int[] nums) {
int n = nums.length;
int point1 = 0,point2 = 0;
while(point2 < n){
if(nums[point1] != nums[point2]){
point1++;//指向下一个元素
nums[point1] = nums[point2]; //将不同的元素赋值
}
point2++;
}
return point1+1;//返回数组长度
}
}
结果如下:
输入 [0,0,1,1,1,1,2,2,3,3,4]
输出 [0,1,2,3,4]
预期结果 [0,1,2,3,4]
本人第一次写文章,如有不妥的地方希望大佬能提醒一下,欢迎各位大佬提出各种建议,我会虚心学习。