java 数插入数组问题 题目是 在排序好的数组中添加一个数字,将添加后的数字插入到合适位置
importjava.util.Scanner;publicclassxiti4_10{/***@paramargs*/publicstaticvoidmain(Stri...
import java.util.Scanner;
public class xiti4_10 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int mark = 0;
Scanner in = new Scanner(System.in);
System.out.print("数组长度");
int[] a = new int[in.nextInt()];
for (int i = 0; i < a.length; i++) {
a[i] = (int) (Math.random() * 100);
}
java.util.Arrays.sort(a);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.print("再输入一个数");
int key = in.nextInt();
for (int i = 0; i < a.length; i++) {
if (key < a[i]) {
mark = i;
}
}
int temp = key;
int[] b = new int[a.length + 1];
b[mark] = temp;
for (int i = mark + 1; i <= b.length - 1; i++) {
b[i + 1] = a[i];
}
for (int i = 0; i < mark; i++) {
b[i] = a[i];
}
System.out.println("插入后:");
for (int i = 0; i < b.length; i++) {
System.out.print(b[i] + " ");
}
}
}
这两行出了问题,指导指导我 谢谢
for (int i = mark + 1; i <= b.length - 1; i++) {
b[i + 1] = a[i];
} 展开
public class xiti4_10 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int mark = 0;
Scanner in = new Scanner(System.in);
System.out.print("数组长度");
int[] a = new int[in.nextInt()];
for (int i = 0; i < a.length; i++) {
a[i] = (int) (Math.random() * 100);
}
java.util.Arrays.sort(a);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.print("再输入一个数");
int key = in.nextInt();
for (int i = 0; i < a.length; i++) {
if (key < a[i]) {
mark = i;
}
}
int temp = key;
int[] b = new int[a.length + 1];
b[mark] = temp;
for (int i = mark + 1; i <= b.length - 1; i++) {
b[i + 1] = a[i];
}
for (int i = 0; i < mark; i++) {
b[i] = a[i];
}
System.out.println("插入后:");
for (int i = 0; i < b.length; i++) {
System.out.print(b[i] + " ");
}
}
}
这两行出了问题,指导指导我 谢谢
for (int i = mark + 1; i <= b.length - 1; i++) {
b[i + 1] = a[i];
} 展开
展开全部
改成
for (int i = mark + 1; i < b.length - 1; i++) {
b[i + 1] = a[i];
}
当 i = b.length - 1的时候i + 1就是b.length
b[b.length]显然溢出了
因为数组的下标是从0开始的,所以数组b最后的元素只到b[b.length - 1]
for (int i = mark + 1; i < b.length - 1; i++) {
b[i + 1] = a[i];
}
当 i = b.length - 1的时候i + 1就是b.length
b[b.length]显然溢出了
因为数组的下标是从0开始的,所以数组b最后的元素只到b[b.length - 1]
追问
实现方法还是差一点啊 能不能运行了分析一下
追答
你的逻辑还没理顺啊!
for (int i = 0; i < a.length; i++) {
if (key < a[i]) {
mark = i;
}
}
这里,找到了mark的值以后要break,不然循环会继续往下,因为a[mark]后边的数都是比a[mark]大的,所以key<a[i]一直是真,实际效果就是mark的值会是a.length-1,显然不是本来的逻辑
还有一个BUG,当key的值比数组a中的数都大的时候,key<a[i]一直为假,mark=i就不执行了,mark的值还是0,也是不符合逻辑的。一个解决办法是声明mark的时候赋值为-1,在上面那个循环后面加检查 if (mark == -1) {mark = a.length;}
for (int i = mark + 1; i <= b.length - 1; i++) {
b[i + 1] = a[i];
}
不改数组会溢出,改成 i < b.length - 1那么a[mark]就没有复制到数组b里,下面两种改法都可以
for (int i = mark; i < b.length - 1; i++) {
b[i + 1] = a[i];
}
for (int i = mark + 1; i < b.length; i++) {
b[i] = a[i - 1];
}
至于为什么,想想逻辑,元素是怎么从a复制到b。
还有temp有什么用,直接用key不就好了
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询