Java删除数组中的重复项、移除数组中指定元素

package com.zpr.array;

/*
* 删除数组中的重复项
*   原地删除重复出现的有序数组,使得每个元素只出现一次,返回删除重复元素后的数组长度
*   如:给定nums = {0,0,1,1,1,2,2,3,3,3}
*       返回:{0,1,2,3}
* 思路:
*   根据题目数组是有序的,所以只需比较相邻两个元素即可
*   如果不相等,说明元素不同,往前放
*   扩展:若是无序数组,可先使用排序算法将数组变有序,后删除重复即可
* */
public class DeleteSame_number {
    public static void main(String[] args) {
        int[] nums = {3,1,1,2,2,3,4,15,4,6,7,7,9,9,10};

        // 数组反转
//        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;
//        }

        int length = test(nums);
        System.out.println("删除数组后长度:"+length);
        for (int i = 0; i < length; i++) {
            System.out.print(nums[i] + "\t");
        }

    }
    public static int test(int[] nums){
        // 有序数组(含重复)
        // length已有元素个数,默认第一个是不需要比较的
        // 也是下一个元素下标
        int length = 1;
        for (int i = 0; i < nums.length-1; i++) {
            // 判断当前元素是否和后面元素相等
            if (nums[i] != nums[i+1]){
                nums[length] = nums[i+1];
                length++;
            }
        }
//        for (int i = 0; i < length; i++) {
//            System.out.print(nums[i] + "\t");
//        }
//        System.out.println("删除数组后长度:"+length);
//
//        System.out.println("变化后数组");
//        for (int num : nums) {
//            System.out.print(num + "\t");
//        }
        return length;
    }

    /**
     * 如果无序,删除重复元素(不能排序)
     * 思路:嵌套循环,每次和前面已有的不重复元素进行比较,不等放前面,相等不管
     * @param nums
     * @return
     */
    public static int test2(int[] nums){
        // length已有元素个数,默认第一个是不需要比较的
        // 也是下一个元素下标
        int length = 1;

        // 从第二位开始,每次和前面不重复比较
        for (int i = 1; i < nums.length; i++) {
            // 每次和当前位置的数比较,如果不等,就放到前面
            // 假设不相等
            boolean flag = false;
            for (int j = 0; j < length; j++) {
                // 判断当前元素是否和前面元素相等
                if (nums[i]==nums[j]){
                    flag = true;
                    break;
                }
            }
            // 当前位置的数比较,如果不等
            if (!flag){
                nums[length] = nums[i];
                length++;
            }

        }

        return length;
    }
}


package com.zpr.array;
/*
* 移除元素:
*   给定一个数组 nums 和一个值 var,原地移除所有数值为var的元素,返回移除后数组的新长度,不使用额外的空间
* */
public class DeleteVar_number {
    public static void main(String[] args) {
        int[] nums = {3,2,2,3,5,1,0};
        int var = 3;
        int length = test(nums, var);
        for (int i = 0; i < length; i++) {
            System.out.print(nums[i] + "\t");
        }

    }
    public static int test(int[] nums, int var){
        int length = 0;
        // 判断每一位是否为要删除的元素,如果不是,放前面
        for (int i = 0; i < nums.length; i++) {
            if (nums[i]!=var){
                nums[length] = nums[i];
                length++;
            }
        }
        return length;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值