• leetcode-18-remove


    283. Move Zeroes

    解题思路:

    从nums[0]开始,如果是零就和它后面的第一个非零数交换,不是零就下一位。不贴代码了,比较简单。


    27. Remove Element

    解题思路:

    这道题对结果的顺序无要求,所以显然可以想到交换。我的思路是设置两个指针i和j,j先从后往前扫一下,找到第一个不是val的位置。

    i从前向后,找到第一个是val的位置,nums[i]和nums[j]交换。最后,nums[j]后面都是val,所以返回j+1即是想要的长度。需要注意

    的是,交换完之后,j向前走,前面仍然可能是val,所以需要加一个循环,找到前方第一个不是val的位置作为j的新位置。

    int removeElement(vector<int>& nums, int val) {
            if (nums.size() == 0)
                return 0;
            if (nums.size() == 1) {
                if (nums[0] == val)
                    return 0;
                else
                    return 1;
            } 
            int i,j;
            j = nums.size() - 1;
            while (nums[j] == val) {
                j --;
                if (j < 0)
                    return 0;
            }
            for (i = 0; i <= j; i++) {
                if (nums[i] == val) {
                    nums[i] = nums[j];
                    nums[j] = val;
                    j --;
                    // nums[j] may be val. then move forward.
                    while (nums[j] == val)
                        j--;
                    continue;
                }
                
            }
            return j+1;
        }
    

    26. Remove Duplicates from Sorted Array

    解题思路:

    考虑到nums是排好序的,所以先找到第一个与nums[i]不同的位置j,nums[i+1]=nums[j],然后i继续向前扫。如果nums[i]和nums[j]不相等,

    那就继续向前扫咯。以1112222233为例。当然,如果有1111这种情况,在找j的时候,j会等于nums.size()这时候,终止就可以了。

    int removeDuplicates(vector<int>& nums) {
            if (nums.size() < 2)
                return nums.size();
            int i = 0;
            int j = i + 1;
            while(i < nums.size()-1) {
                if (nums[j] == nums[i]) {
                    while (nums[j] == nums[i]) {
                        j++;
                        if (j == nums.size())
                            return i+1;
                    }
                    nums[i+1] = nums[j];
                    i++;
                    continue;
                }
                else {
                    i++;
                    j++;
                }
            }
            return i+1;
        }  

    203. Remove Linked List Elements

    解题思路:

    这道题WA好几次。。没考虑到连续几个数都是val的情况。我的思路是先处理头部是val的情况,然后处理val在second

    的位置的情况。不过写的时候一定要考虑指针为空的情况,特别是用到->next赋值的时候。

    ListNode* removeElements(ListNode* head, int val) {
            if (head == NULL)
                return head;
            // if val is at head
            while (head != NULL && head->val == val) {
                head = head->next;
            }
            if (head == NULL)
                return head;
            ListNode* first = head;
            ListNode* second = head->next;
            while (second != NULL) {
                if (second->val == val) {
                    // judge if second is NULL. serial val
                    while(second != NULL && second->val == val) {
                        second = second->next;
                    }
                    if (second == NULL) {
                        first->next = NULL;
                    }
                    else {
                        first->next = second;
                        first = second;
                        if (first != NULL)
                            second = first->next;
                        else
                            second = NULL;
                    }
                    continue;
                }
                // not val
                first = second;
                second = second->next;
            }
            return head;
        }
  • 相关阅读:
    几个不错的学习网址不断更新中
    重构之美-跨越Web标准,触碰语义网[分离:通用也许是个美丽陷阱]
    在APP中分享小程序和在企微中分享小程序到对话聊天框需要做哪些配置
    第三方平台授权小程序遇到的问题
    第三方授权小程序,将小程序代码推到第三方平台流程以及需要配置哪些东西
    html5专题页
    lua字符串格式化多参用法
    lua三目运算符逻辑盲点
    部分数学符号
    常用软件链接
  • 原文地址:https://www.cnblogs.com/pxy7896/p/6662298.html
Copyright © 2020-2023  润新知