欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java小练_数组

程序员文章站 2022-07-12 08:12:35
...

1.在歌唱比赛中,共有10位评委进行打分,在计算歌手得分时,去掉一个最高分,去掉一个最低分,然后剩余的8位评委的分数进行平均,就是该选手的最终得分。输入每个评委的评分,求某选手的得分。

		Scanner input = new Scanner(System.in);
		System.out.println("请问有几位评委:");
		int judgeNum = input.nextInt();	
		double totalScore = 0;
		int[] scores = new int[judgeNum];//把每次录入的分数动态存储起来
		//循环录入每个评委的分数
		for(int i=0;i<judgeNum;i++) {
			System.out.println("请录入第"+(i+1)+"个评委的分数:");
			int score = input.nextInt();
			scores[i] = score;
			totalScore += score;
		}
		int maxScore = scores[0];
		int minScore = scores[0];
		for(int sc:scores) {
			//结合三元运算符
			maxScore = (maxScore>sc)?maxScore:sc;
			minScore = (minScore<sc)?minScore:sc;
		}
		for(int index=1;index<judgeNum;index++) {
			maxScore = (maxScore>scores[index])?maxScore:scores[index];
			minScore = (minScore<scores[index])?minScore:scores[index];
		}
		System.out.println("歌手的最高得分:"+maxScore);
		System.out.println("歌手的最低得分:"+minScore);
		totalScore = totalScore-maxScore-minScore;
		double avg = totalScore/(judgeNum-2);
		System.out.println("去掉最高分和最低分之后,歌手的最终成绩为:"+avg);

Java小练_数组

2.声明一个字符串的数组,空间为5个。使用循环接收五个学生的姓名。再使用循环输出这五个学生的姓名。

		String[] arr2 = new String[5];
		Scanner input = new Scanner(System.in);
		for(int i=0;i<5;i++) {
			System.out.println("请录入第"+(i+1)+"个学生的姓名:");
			String name = input.next();
			arr2[i] = name;
		}
		for(int index=0,len=arr2.length;index<len;index++) {
			System.out.println("第"+(index+1)+"个学生的姓名为:"+arr2[index]);
		}

Java小练_数组

3.声明一个int型的数组,循环接收8个学生的成绩,计算这8个学生的总分、平均分、最高分、最低分。

		int[] arr3 = new int[8];
		Scanner input = new Scanner(System.in);
		int minScore = arr3[0];
		int maxScore = arr3[0];
		double totalScore = 0;
		for(int i=0;i<arr3.length;i++) {
			System.out.println("请录入第"+(i+1)+"个学生的成绩:");
			int score = input.nextInt();
			arr3[i] = score;
			totalScore += score;
		}
		double avgScore = totalScore/arr3.length;
		for(int sc:arr3) {
			minScore = (minScore<sc)?minScore:sc;
			maxScore = (maxScore>sc)?maxScore:sc;
		}
		for(int index=0,len=arr3.length;index<len;index++) {
			System.out.println("第"+(index+1)+"个学生的成绩为:"+arr3[index]);
		}
		System.out.println("这8个学生的总分为:"+totalScore);
		System.out.println("这8个学生的平均分为:"+avgScore);
		System.out.println("这8个学生中的最高分为:"+maxScore);
		System.out.println("这8个学生中的最低分为:"+minScore);

Java小练_数组

4.现在有如下一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; 要求将以上数组中的0项去掉,将不为0的值存入一个新的数组,生成新的数组为 int newArr[]={1,3,4,5,6,6,5,4,7,6,7,5};

		int oldArr[] = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; 
		int[] newArr = new int[oldArr.length];//将oldArr数组的元素复制到一个新的数组中
		int index = 0;
		for(int i=0;i<oldArr.length;i++) {
			if(oldArr[i] != 0) {
				newArr[index] = oldArr[i];
				index++;
			}
		}
		newArr = Arrays.copyOf(newArr,index);//把筛选出来的不为0的元素复制到newArr中去		
		System.out.println("newArr="+Arrays.toString(newArr));//newArr=[1,3,4,5,6,6,5,4,7,6,7,5]

Java小练_数组

5.有一整数数组,{1,3,-1,5,-2},将数据复制到新数组中,要求逆序输出新数组中的数,同时并将小于0的元素按0存储。

		int arr5[]= {1,3,-1,5,-2};
		int[] newArr = new int[arr5.length];
		//第一步:将原数组逆序处理
		for(int i=(arr5.length)/2;i>=0;i--) {
			int temp = arr5[i];
			arr5[i] = arr5[arr5.length-1-i];
			arr5[arr5.length-1-i] = temp;
		}
//		System.out.println("niArr="+Arrays.toString(arr5));	//niArr=[-2, 5, -1, 3, 1]
		//第二步:将小于0的元素按0存储
		for(int index=0;index<arr5.length;index++) {
			if(arr5[index]<0) {
				newArr[index] = 0;
			}else {
				newArr[index] = arr5[index];
			}
		}
		System.out.println("newArr="+Arrays.toString(newArr));	

Java小练_数组
参考答案是把小于0的条件结合在逆序循环中,看起来程序简化了些,我起初也是这个思路,但是我想用Arrays.toString()整个地输出数组,相当于索引也逆序了,而不是按照逆序每次输出一个,所以分开写了。
Java小练_数组

6.按要求输出数组。

		//6.int array [] = {2,432,5221,235,2,5352,1,53,5,3,5364,2,2,63,3533,2,53,532,532}; 
		//6.1.求所有元素和。 
		//6.2.输出所有奇数下标元素。如:array[1] 
		//6.3.输出所有元素中,值为奇数的。 
		//6.4.将所有元素乘二。 
		//6.5.将所有元素加到第一个元素中。 
		//6.6.将奇数索引位置元素存到B数组中
		//6.7.偶数元素存到C数组中
		//6.8.分别逆序输出B数组和C数组
		int[] nums = {2,432,5221,235,2,5352,1,53,5,3,5364,2,2,63,3533,2,53,532,532}; 
		int totalNum = 0;
		int[] newNums = new int[nums.length];
		int[] newNums2 = new int[nums.length];
		int[] b = new int[nums.length/2];//B数组的长度是nums.length/2
		int[] c = new int[nums.length];//C数组的长度暂定与原数组一致
		int bIndex = 0;
		int cIndex = 0;
		for(int index=0;index<nums.length;index++) {
			totalNum += nums[index];
			if(index%2 != 0) {
//				System.out.println("下标为奇数"+index+"的元素:"+nums[index]);
				b[bIndex] = nums[index];
				bIndex++;
			}
			if(nums[index]%2 != 0) {
				System.out.println("值为奇数的元素:"+nums[index]);
			}else {
				c[cIndex] = nums[index];
				cIndex++;
			}
			newNums[index] = nums[index]*2;//将所有元素乘2
			newNums2 = Arrays.copyOf(nums,nums.length);//复制原数组到新数组
			newNums2[0] = totalNum;
		}
		//此时c数组里是原数组nums的偶数元素,但是c数组的长度最初设置的与原数组nums一致,所以不为偶数的索引位置值为0
		//需要将这些值为0的元素删去。也就是合理化c数组的元素长度
		int cCount = 0;
		for(int num : c) {
			if(num!=0) {
				c[cCount] = num;
				cCount++;
			}
		}
		c = Arrays.copyOf(c, cCount);//将不等于0的元素拿出来给新的c数组
		System.out.println("6.1.所有元素和:"+totalNum);
		System.out.println("6.4.元素乘以2后的数组:"+Arrays.toString(newNums));
		System.out.println("6.5.将所有元素加到第一个元素后的数组:"+Arrays.toString(newNums2));
		System.out.println("6.6.含奇数索引位置元素的B数组:"+Arrays.toString(b));
		System.out.println("6.7.含偶数元素的C数组:"+Arrays.toString(c));
        System.out.print("6.8.逆序输出B数组:");
        for (bIndex = b.length-1; bIndex >= 0; bIndex--) {
            System.out.print(b[bIndex] + ",");
        }
        System.out.print("\n"+"6.8.逆序输出C数组:");
        for (cIndex = c.length-1; cIndex >= 0; cIndex--) {
        	System.out.print(c[cIndex] + ",");
        }

Java小练_数组

7.从键盘接受10个整数保存在数组中,将10个数中最大的与第一个元素交换,最小的与最后一个元素交换,其余元素位置不变,输出数组元素的值。

//7.从键盘接受10个整数保存在数组中,将10个数中最大的与第一个元素交换,最小的与最后一个元素交换,其余元素位置不变,输出数组元素的值		
		Scanner input = new Scanner(System.in);
		int[] array = new int[10];	
		int len = array.length;//初始化数组的元素数
		for(int index = 0;index < len;index++) {
			System.out.println("请录入第"+(index+1)+"个整数:");
			array[index] = input.nextInt();
		}
		System.out.println("交换之前:"+Arrays.toString(array));
		int maxIndex = 0;//用maxIndex来记录最大的数的下标
		int minIndex = 0;//用minIndex来记录最小的数的下标
		int max = array[0];//用max来记录最大的元素
		int min = array[0];//用min来记录最小的元素
		int temp = 0;//初始化一个中间值方便交换元素
		for(int index = 0;index < len-1;index++) {
			min = (min<array[index])?min:array[index];//找出最大元素
			max = (max>array[index])?max:array[index];//找出最小元素
			if(min==array[index]) {
				minIndex = index;//找出最大元素的下标
			}
			if(max==array[index]) {
				maxIndex = index;//找出最小元素的下标
			}
		}
		//最大值与第一个元素交换
		temp = array[0];
		array[0] = max;
		array[maxIndex] = temp;
		//最小的与最后一个元素交换
		temp = array[len-1];
		array[len-1] = min;
		array[minIndex] = temp;
		System.out.println("交换之后:"+Arrays.toString(array));

Java小练_数组

我没有考虑到如果数组中出现多个最大值/最小值的情况,参考答案写的很全面,而且做题思路不一样。

我更换位置的思路是找到最大元素和最小元素的下标,然后通过更换下标来更换位置,而参考答案的做题思路是先用Arrays.sort()把数组从小到大排序,这样最大值自然在最后,最小值在最前,更换首位的元素值即可,不更改下标值。

比较赞同参考答案的做法,更换下标值容易逻辑混乱,换着换着就迷糊了。
Java小练_数组

考虑两个特殊情况:最大值与最小值正好在首尾;数组的元素中有多个最大值或者最小值的问题。

		//参考答案
		int[] array = {9,2,9,1,7,1,3};
		int len = array.length;
		System.out.println("交换之前:"+Arrays.toString(array));
		int[] newArray = Arrays.copyOf(array, len);
		Arrays.sort(newArray);// 排序方法,顺序从小到大
		int maxIndex = 0;
		int minIndex = 0;
		int max = newArray[len-1];//最大值
		int min = newArray[0];//最小值
		int temp = 0;
		//特殊的情况一:
		//最大值与最小值正好在首尾 最小值:array[0] 最大值 = array[len-1] 直接让首尾元素做交换
		if(max == array[len-1] && min == array[0]) {
			//第一个元素与最后一个元素进行交换
			array[len-1] = min;
			array[0] = max;
			System.out.println("交换之后:" + Arrays.toString(array));
			return;
		}
		//特殊情况二:
		//数组的元素中 有多个最大值或者最小值的问题(与第一个最值出现的位置进行交换)
		//if逻辑的判断有且执行一次的
		int maxCount = 0;//充当最大值出现的次数
		int minCount = 0;//充当最小值出现的次数
		for(int index=0;index<len;index++) {
			if(max == array[index]) {
				maxCount++;
				if(maxCount>1) {
					continue;
				}
				maxIndex = index;
			}
			if(min == array[index]) {
				minCount++;
				if(minCount>1) {
					continue;
				}
				minIndex = index;
			}
		}
		//交换放循环外面,只一次交换,提高效率
		//最大值与第一个元素交换
		temp = array[0];
		array[0] = max;
		array[maxIndex] = temp;
		//最小的与最后一个元素交换
		temp = array[len-1];
		array[len-1] = min;
		array[minIndex] = temp;
		System.out.println("交换之后:"+Arrays.toString(array));

输出结果:
交换之前:[9, 2, 9, 1, 7, 1, 3]
交换之后:[9, 2, 9, 3, 7, 1, 1]

相关标签: Java练习题