leetcode练习

49 阅读1分钟

我正在参加「掘金·启航计划」

删除排序数组中的重复项

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。

由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。

将最终结果插入 nums 的前 k 个位置后返回 k

int *rear = nums[nums.size()-1];
        int *h = null;
        int *r = null;
        int n = 0;
        //利用一个指针一步一步向前测试
        while(h != rear)
        {
            r = h;
            r++;
            //测试是否与前一个数组内容相同
            while(*r == *h)
            {
                int *p =r;
                #相同后,做删除操作
                while(p != rear+1)
                {
                    *p = *(p+1);
                    p++;
                }
            }
            h++;
            n++;
        }
        return n;

int removeDuplicates(vector<int>& nums) {
         //双指针解决
        //边界条件判断
        if (nums.size() == 0)
            return 0;
        int left = 0;
        for (int right = 1; right < nums.size(); right++)
            //如果左指针和右指针指向的值一样,说明有重复的,
            //这个时候,左指针不动,右指针继续往右移。如果他俩
            //指向的值不一样就把右指针指向的值往前挪
            if (nums[left] != nums[right])
                nums[++left] = nums[right];
        return ++left;
    }

该方法用一个数组,同时完成判断重复和删除重复的操作。

判断重复是通过一个标记不断向后判断,遇到不同数组内容记录到nums[left]。

旋转数组

给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        if(nums.size()==1)
        {
            printf("%d",nums[0]);
        }
        else if(k==0)
        {   
            for(int n=0;n<nums.size();n++)
            {
                printf("%d",nums[n]);
            }
        }
        else
        {
        int t = 0;
        for(int i=1; i<=k; i++)
        {
            for(int j = nums.size()-1; j>=0;j--)
            {
                if(j == 0)
                {
                    nums[0] = t;
                }
                else if(j == nums.size()-1)
                {
                    t = nums[nums.size()-1];
                    nums[j] = nums[j-1];
                }
                else
                {
                    nums[j] = nums[j-1];

                }
            }
        }
        for(int n=0;n<nums.size();n++)
            {
                printf("%d",nums[n]);
            }
        }
    }
};

思路:分解为两步:1.确定向后移几位。2.在每移一位,执行旋转操作