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);
}
}
因为你每次循环都new了一个新数组,也没有修改原数组
一、题目:
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 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]+" ");
}
}
}
这个问题是因为在输出数组元素的时候,使用了错误的符号“<”和“>”,正确的符号应该是“<”和“>”,修改一下代码应该就可以达到目标效果了。下面是修改后的代码:
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);
}
}