关于#java#的问题:数组扩容内容:想问一下为什么达不到以下的效果

import java.util.Scanner;
public class ArrayAdd02 {

public static void main(String[] args) {
    /*
    要求:实现动态的给数组添加元素效果,实现对数组扩容。ArrayAdd.java
    1.原始数组使用静态分配 int[] arr = {1,2,3}
    2.增加的元素4,直接放在数组的最后 arr = {1,2,3,4}
    3.用户可以通过如下方法来决定是否继续添加,添加成功,是否继续?y/n
    */

    Scanner myScanner=new Scanner(System.in);
    int arr[]={1,2,3};
    
    do {
    int arrnew[]= new int[arr.length+1];
    //遍历 arr 数组,依次将arr的元素拷贝到 arrNew数组    
    for(int i=0;iout.println("请输入你要添加的元素");
    int  q=myScanner.nextInt();
    //把q赋给arrNew最后一个元素
    arrnew[arrnew.length-1]=q;
    //输出arrnew 看看效果
    System.out.println("====arrnew扩容后元素情况====");
    for(int i = 0; i < arrnew.length; i++) {
            System.out.print(arrnew[i] + "\t");
        }
        //问用户是否继续

    System.out.println("是否继续添加 y/n");
    char key = myScanner.next().charAt(0);
    if (key=='n'){
        break;
    }
    }while(true);

}
}

img


数组扩容内容:想问一下为什么达不到以下的效果

img

因为你每次循环都new了一个新数组,也没有修改原数组

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7733399
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:牛客网刷题java之把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素
  • 除此之外, 这篇博客: java定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。中的 标题:java定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 一、题目:
    给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

    不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

    链接:添加链接描述
    在这里插入图片描述
    二、题解
    方式一:复杂度为n^2

    public int deleteRepeatNum(int[] nums) {
    		int i=1;
    		int j=nums.length-1;
    		while(i<j) {
    			if(nums[i]==nums[i-1]) {
    				for(int t=i;t<j;t++) {
    					nums[t]=nums[t+1];
    				}
    				nums[j]=nums[i];
    				j--;
    			}else{
    				i++;
    			}
    		}
    		
    		if(nums.length>1) {
    			if(nums[i]==nums[i-1]) {
    				return i;
    			}
    		}
    		return j+1;
    	}
    

    方法二、复杂度为n, 相等就移动快指针j,不相等就移动慢指针i,并赋值给nums[i]=nums[j]

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

    完整代码如下:

    public class TestDeleteRepeatNum {
    	/**
    	 * 复杂度为n^2
    	 * @param nums
    	 * @return
    	 */
    	public int deleteRepeatNum(int[] nums) {
    		int i=1;
    		int j=nums.length-1;
    		while(i<j) {
    			if(nums[i]==nums[i-1]) {
    				for(int t=i;t<j;t++) {
    					nums[t]=nums[t+1];
    				}
    				nums[j]=nums[i];
    				j--;
    			}else{
    				i++;
    			}
    		}
    		
    		if(nums.length>1) {
    			if(nums[i]==nums[i-1]) {
    				return i;
    			}
    		}
    		return j+1;
    	}
    	@Test
    	public void test() {
    //		int[] nums=new int[] {0,0,1,1,1,2,2,3,3,6};
    //		int[] nums=new int[] {0,0,1,5,8,8,16,28};
    //		int[] nums=new int[] {1,1,1,1,1};
    		int[] nums=new int[] {0,0,1,1,1,1,1};
    		
    		int len = this.deleteRepeatNum(nums);
    		for(int i=0;i<len;i++) {
    			System.out.print(nums[i]+"  ");
    		}
    	}
    	
    	/**
    	 * 复杂度为n, 相等就移动快指针j,不相等就移动慢指针i,并赋值给nums[i]=nums[j]
    	 * @param nums
    	 * @return
    	 */
    	public int deleteRepeatNum02(int[] nums) {
    		int i=0;
    		for(int j=i+1;j<nums.length;j++) {
    			if(nums[i]!=nums[j]) {
    				i++;
    				nums[i]=nums[j];
    			}
    		}
    		return i+1;
    	}
    	@Test
    	public void test02() {
    //		int[] nums=new int[] {0,0,1,1,1,2,2,3,3,6};
    //		int[] nums=new int[] {0,0,1,5,8,8,16,28};
    //		int[] nums=new int[] {1,1,1,1,1};
    		int[] nums=new int[] {0,0,1,1,1,1,1};
    		
    		int len = this.deleteRepeatNum02(nums);
    		for(int i=0;i<len;i++) {
    			System.out.print(nums[i]+"  ");
    		}
    	}
    }
    
  • 您还可以看一下 朱祚华老师的微信支付2021系列之付款码支付一学就会java版课程中的 微信付款码支付课程简介小节, 巩固相关知识点

以下内容部分参考ChatGPT模型:


这个问题是因为在输出数组元素的时候,使用了错误的符号“<”和“>”,正确的符号应该是“<”和“>”,修改一下代码应该就可以达到目标效果了。下面是修改后的代码:

import java.util.Scanner;

public class ArrayAdd02 {
    public static void main(String[] args) {
        /*
        要求:实现动态的给数组添加元素效果,实现对数组扩容。ArrayAdd.java
        1.原始数组使用静态分配 int[] arr = {1,2,3}
        2.增加的元素4,直接放在数组的最后 arr = {1,2,3,4}
        3.用户可以通过如下方法来决定是否继续添加,添加成功,是否继续?y/n
        */

        Scanner myScanner = new Scanner(System.in);
        int arr[] = {1, 2, 3};

        do {
            int arrnew[] = new int[arr.length + 1];
            //遍历 arr 数组,依次将arr的元素拷贝到 arrNew数组    
            for (int i = 0; i < arr.length; i++) {
                arrnew[i] = arr[i];
            }
            System.out.println("请输入你要添加的元素");
            int q = myScanner.nextInt();
            //把q赋给arrNew最后一个元素
            arrnew[arrnew.length - 1] = q;
            //输出arrnew 看看效果
            System.out.println("====arrnew扩容后元素情况====");
            for (int i = 0; i < arrnew.length; i++) {
                System.out.print(arrnew[i] + "\t");
            }
            //问用户是否继续

            System.out.println("是否继续添加 y/n");
            char key = myScanner.next().charAt(0);
            if (key == 'n') {
                break;
            }
            arr = arrnew; //把新的数组赋值给原来的数组
        } while (true);
    }
}

如果我的建议对您有帮助、请点击采纳、祝您生活愉快