首页 > 其他分享 >刷题记录-移除元素

刷题记录-移除元素

时间:2023-10-24 20:45:22浏览次数:33  
标签:nums int 元素 ++ length 数组 移除 刷题

刷题记录-移除元素

移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1:

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

示例 2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

思路:简单来说就是两件事,一是找到数组中不等于val的元素个数并返回。一个for循环即可。二是将数组中不等于val都放到前面。顺序不定。另一个for循环,将数组后面不等于val与前面等于val的交换位置。O(n)

public int removeElement(int[] nums, int val) {
    int res= nums.length;
    for (int i = 0; i <=nums.length-1 ; i++) {
        if(nums[i]==val){
            res-=1;
        }
    }

    int high=nums.length-1;
    for (int i = 0; i < res; i++) {
        if (nums[i]==val){
            while (nums[high]==val&high>res){
                high-=1;
            }
            nums[i]=nums[high];
            nums[high]=val;
        }
    }
    return res;
}

删除排序数组中的有序项

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

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。

  • 返回 k

    示例 1:

    输入:nums = [1,1,2]
    输出:2, nums = [1,2,_]
    解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
    

    示例 2:

    输入:nums = [0,0,1,1,1,2,2,3,3,4]
    输出:5, nums = [0,1,2,3,4]
    解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
    

思路:第一种做法复杂了,有一个新数组来存,j指向当前赋值的位置。第0个位置默认赋值。后面找到不一样的就赋值。实际不需要两个数组,在原来数组上用两个指针即可。一个指向赋值的位置,一个指向当前不同的位置。

解法一:

    public int removeDuplicates(int[] nums) {
        int res= nums.length,j=0;
        int [] nums1=new int[nums.length];
        for (int i = 0; i < nums.length; i++) {
            if(i==0){
                nums1[j]=nums[i];
                j++;
                continue;
            }
            if (nums[i]==nums[i-1]){
                res-=1;
                continue;
            }
            nums1[j]=nums[i];
            nums[j]=nums1[j];
            j++;
        }



        return res;
    }

解法二

public int removeDuplicates(int[] nums) {
        int j=0;
        for (int i = 1; i < nums.length; i++) {
            if(nums[i]!=nums[j]){
                j++;
                nums[j]=nums[i];
            }
        }

        return j+1;
    }

移动0

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

public void moveZeroes(int[] nums) {
    if(nums.length<2){
        return;
    }
    int j = 0;
    for(int i=0;i<nums.length;++i) {
        if(nums[i]!=0) {
            nums[j++] = nums[i];
        }
    }
    //非0元素统计完了,剩下的都是0了
    //所以第二次遍历把末尾的元素都赋为0即可
    for(int i=j;i<nums.length;++i) {
        nums[i] = 0;
    }
}

第一遍历将所有非0值放到前面,第二次将数组后面的元素赋值为0

比较含空格的字符串

给定 st 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true# 代表退格字符。

注意:如果对空文本输入退格字符,文本继续为空。

示例 1:

输入:s = "ab#c", t = "ad#c"
输出:true
解释:s 和 t 都会变成 "ac"。

示例 2:

输入:s = "ab##", t = "c#d#"
输出:true
解释:s 和 t 都会变成 ""。

示例 3:

输入:s = "a#c", t = "b"
输出:false
解释:s 会变成 "c",但 t 仍然是 "b"。

思路。用两个栈,将st中的字母分别换成两个数组即可

public boolean backspaceCompare(String s, String t) {
    char[] s1=new char[s.length()];
    char temp=s1[0];
    int num=0,num1=0;
    char[] s2=new char[t.length()];
    for (int i = 0; i < s.length(); i++) {
        if(s.charAt(i)!='#'){
            s1[num++]=s.charAt(i);
        }
        else {
            if(num==0){
                continue;
            }
            s1[--num]=temp;
        }
    }
    for (int i = 0; i < t.length(); i++) {
        if(t.charAt(i)!='#'){
            s2[num1++]=t.charAt(i);
        }
        else {
            if(num1==0){
                continue;
            }
            s2[--num1]=temp;
        }
    }
    if(num1!=num){
        return false;
    }
    for (int i = 0; i < num; i++) {
        if (s1[i]!=s2[i]){
            return false;
        }
    }
    return true;
}

有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1:

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

示例 2:

输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]

思路:

这题我写了很多判断,没想到更好的方式。主要因为原数组是递增的,因此可以分以下三种情况

nums最大值小于等于0,此时数组全是负数,将所有元素调过来即可

nums最小值大于等于0,这种最简单,直接原数组平方

除此之外的第三种,即数组内有正有负。此时新开一个数组,从最后开始赋值,用两个指针记录当前比较nums的位置,每次取绝对值的平方赋值即可。代码如下:

public int[] sortedSquares(int[] nums) {
    if(nums.length<2){
        nums[0]=nums[0]*nums[0];
        return nums;
    }
    if (nums[0] >= 0) {
        for (int i = 0; i < nums.length; i++) {
            nums[i]=nums[i]*nums[i];
        }
        return nums;
    }
    if (nums[nums.length-1]<=0){
        for (int i = 0; i < nums.length/2; i++) {
            int temp=nums[i];
            nums[i]=nums[nums.length-1-i];
            nums[nums.length-1-i]=temp;
            nums[i]=nums[i]*nums[i];
            nums[nums.length-1-i]=nums[nums.length-1-i]*nums[nums.length-1-i];
        }
        if(nums.length%2!=0){
            nums[nums.length/2]=nums[nums.length/2]*nums[nums.length/2];
        }
        return nums;
    }

    int p=nums.length-1;
    int q=p,j=0;
    int[] nums1=new int[p+1];
    while (j!=q){
        if(nums[j]<0){
            while (-nums[j]<nums[q]){
                nums1[p]=nums[q]*nums[q];
                q--;
                p--;
            }
            if(j==q){
                break;
            }
            nums1[p]=nums[j]*nums[j];
            p--;
            j++;
        }
        else {
            nums1[p]=nums[q]*nums[q];
            q--;
            p--;
        }
    }
    nums1[0]=nums[j]*nums[j];
    return nums1;
}

标签:nums,int,元素,++,length,数组,移除,刷题
From: https://www.cnblogs.com/hfutxcj/p/17785708.html

相关文章

  • 380. O(1) 时间插入、删除和获取随机元素
    实现RandomizedSet类:RandomizedSet()初始化RandomizedSet对象boolinsert(intval)当元素val不存在时,向集合中插入该项,并返回true;否则,返回false。boolremove(intval)当元素val存在时,从集合中移除该项,并返回true;否则,返回false。intgetRandom()随机返回现......
  • C++桶排序算法的应用:存在重复元素 III
    题目给你一个整数数组nums和两个整数indexDiff和valueDiff。找出满足下述条件的下标对(i,j):i!=j,abs(i-j)<=indexDiffabs(nums[i]-nums[j])<=valueDiff如果存在,返回true;否则,返回false。示例1:输入:nums=[1,2,3,1],indexDiff=3,valueDiff=0输出......
  • 如何用Java找出两个List中的重复元素,读这一篇就够了
     在Java编程中,我们经常需要找出两个列表(List)中的重复元素。在本文中,我们将探讨三种方法来实现这一目标。 方法一:使用HashSetJava中的HashSet是一个不允许有重复元素的集合。我们可以利用这个特性,通过合并两个List并计算差集,来找出重复的元素。以下是一个通过使用HashSet数......
  • ConcurrentModificationException异常,for循环遍历时候, add或者remove减少集合的元素时
    ConcurrentModificationException异常一:ConcurrentModificationException异常:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。二:遍历list集合时删除元素出现的异常publicstaticvoidmain(String[]args){ArrayList<String>list=newArrayList<String>();......
  • 01_移除链表元素
    移除链表元素题意:删除链表中等于给定值val的所有节点。示例1:输入:head=[1,2,6,3,4,5,6],val=6输出:[1,2,3,4,5]示例2:输入:head=[],val=1输出:[]示例3:输入:head=[7,7,7,7],val=7输出:[]203.移除链表元素实现代码如下:(本代码是通过带头节点的单链表来实现......
  • 代码随想训练营第十三天(Pyhton)| 239. 滑动窗口最大值、347.前 K 个高频元素
    239.滑动窗口最大值classSolution:defmaxSlidingWindow(self,nums:List[int],k:int)->List[int]:res=[]tmp=MyQueue()foriinrange(k):tmp.push(nums[i])res.append(tmp.front())fo......
  • Python 数组和列表:创建、访问、添加和删除数组元素
    Python没有内置支持数组,但可以使用Python列表来代替。数组本页将向您展示如何使用列表作为数组,但要在Python中使用数组,您需要导入一个库,比如NumPy库。数组用于在一个变量中存储多个值:示例,创建一个包含汽车名称的数组:cars=["Ford","Volvo","BMW"]什么是数组?数组是......
  • c++ int数组存储long long元素
    高往低存,可能造成数据截断。如longlong64位,int32位,高32位被丢弃。可以将int数组每两个元素分别存储低32位和高32位inta[4];//隐式转换*a=2;//目标格式是int,2默认值默认值默认值*(longlong*)a=2;//目标格式是......
  • 多数元素
    多数元素题目:给定一个大小为n的数组nums,返回其中的多数元素。多数元素是指在数组中出现次数大于⌊n/2⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。分析创建一个新对象key为值,value出现的次数循环数组填充对象判断结束循环代码/***......
  • 前端歌谣的刷题之路-第五十七题-添加元素
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......