巩固题
1、随机产生偶数并排序
案例需求:随机产生10个[1,100]之间的偶数存储到数组中,并按照从小到大排序输出。
开发提示:
- 随机产生[1,50]范围内的整数 * 2 就能得到[1,100]之间的偶数
参考答案:
import java.util.Arrays;
public class Homework1 {
public static void main(String[] args) {
//定义一个数组存储随机10个[1,100]的偶数
int[] arr=new int[10];
for (int i = 0; i < 10; i++) {
int num = (int)(Math.random()*50)+1;
arr[i]=num*2;
}
//利用冒泡排序按照从小到达排序输出
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length-i-1; j++) {
if(arr[j]>arr[j+1]){
int x=arr[j];
arr[j]=arr[j+1];
arr[j+1]=x;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
2、判断单词是否是回文单词
案例需求:从键盘输入一个单词,判断它是否是回文单词。
开发提示:
-
从键盘输入一个单词,存放到一个String类型的变量word中
-
通过word.toCharArray()可以根据字符串word得到一个char[]类型的数组。
其中toCharArray()是String类型提供的系统函数,就像Math.random()等函数一样,后面会学到,这里先提前用一下。它的作用就是创建一个char[]数组,并把字符串中的每一个字符依次存储到这个char[]数组中。
Scanner input = new Scanner(System.in);
System.out.print("请输入一个英语单词:");
String word = input.next(); //假如输入的英语单词是mom
char[] wordCharArray = word.toCharArray(); // wordCharArray字符数组内容是{'m','o','m'}
- 判断数组元素是否首尾对应相等,如果是,那么你输入的单词就是回文单词,否则就不是。
参考答案:
import java.util.Scanner;
public class Homework2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个英文单词:");
String word = scanner.next();
char[] words = word.toCharArray();
boolean palindrome = false;
for (int i = 0; i < words.length; i++) {
//定义一个布尔型变量palindrome来判断是不是回文单词,默认为false
if (words[i] != words[words.length - i - 1]) {
palindrome=true;
break;
}
}
if(!palindrome){
System.out.println(word + "是一个回文单词");
}else {
System.out.println(word + "不是一个回文单词");
}
}
}
3、查找满分学员
案例需求:先从键盘输入本组学员的人数,再从键盘输入本组学员的姓名和成绩,显示学员姓名和成绩。最后查找是否有满分(100)学员,如果有显示姓名,否则显示没有满分学员。
参考答案:
import java.util.Scanner;
public class Homework3 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入本组学员的人数:");
int people = scanner.nextInt();
String[] name = new String[people];
int[] grade = new int[people];
//输入学员姓名和成绩
for (int i = 0; i < people; i++) {
System.out.println("请输入第" + (i + 1) + "个学生的姓名:");
name[i] = scanner.next();
System.out.println("请输入第" + (i + 1) + "个学生的成绩:");
grade[i] = scanner.nextInt();
}
//显示学员姓名和成绩
for (int i = 0; i < name.length; i++) {
System.out.print(name[i] + " \t");
}
System.out.println();
for (int i = 0; i < grade.length; i++) {
System.out.print(grade[i] + " \t");
}
System.out.println();
int count=0;
for (int i = 0; i < grade.length; i++) {
if(grade[i]==100){
System.out.println(name[i] + "是满分");
count++;
}
}
if(count==0){
System.out.println("没有满分学员");
}
}
}
4、查字
案例需求:公司年会有一个寻找锦鲤的游戏,每一个员工随意写一个字,如果在“锦鲤”词库中有这个字,那么就奖励500元锦鲤红包,否则就没有,每人只能玩一次。
现有锦鲤字库如下,它们按照Unicode编码值从小到大排序:
char[] koiFishWords = {'一','今','地','定','尚','年','开','我','果','火','爱','硅','结','花','谷','遍'};
开发提示:
(1)使用顺序查找
(2)使用二分查找:效率更高,因为koiFishWords是有序的数组
参考答案:
import java.util.Scanner;
public class Homework4 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
char[] koiFishWords = {'一', '今', '地', '定', '尚', '年', '开', '我', '果', '火', '爱', '硅', '结', '花', '谷', '遍'};
System.out.println("请输入员工写的一个字:");
char word = scanner.next().charAt(0);
scanner.close();
//方法1:顺序查找
boolean flag = false;
for (int i = 0; i < koiFishWords.length; i++) {
if (koiFishWords[i] == word) {
flag = true;
break;
}
}
if (flag) {
System.out.println("恭喜你中奖了,获得500元锦鲤红包");
} else {
System.out.println("抱歉,你没有中奖");
}
//方法2:二分查找
int start=0,end=koiFishWords.length-1,index=-1,middle;
while(start<=end){
middle=(start+end)>>1;
if(word>koiFishWords[middle]){
start=middle+1;
}else if (word<koiFishWords[middle]){
end =middle-1;
}else {
index=middle;
break;
}
}
if(index!=-1){
System.out.println("恭喜你中奖了,获得500元锦鲤红包");
}else {
System.out.println("抱歉,你没有中奖");
}
}
}
5、找出出现奇数次的数
案例需求:已知某个数组中只有1个数字的次数出现奇数次,请找出这个数字。
int[] arr = {2,6,2,5,7,1,2,5,6,1,5,6,1,6,5,7,1};
开发提示:
因为对于任意一个数k,有k ^ k = 0,k ^ 0 = k,所以将arr中所有元素进行异或,那么个数为偶数的元素异或后都变成了0,只留下了个数为奇数的那个元素。
参考答案:
public class Homwork5 {
public static void main(String[] args) {
int[] arr = {2, 6, 2, 5, 7, 1, 2, 5, 6, 1, 5, 6, 1, 6, 5, 7, 1};
//方法1:定义一个变量counts来记录从0-9的数字出现的次数
int[] counts = new int[10];
for (int i = 0; i < arr.length; i++) {
int x = arr[i];
counts[x]++;
}
for (int i = 0; i < counts.length; i++) {
if (counts[i] % 2 != 0) {
System.out.println("数组中出现奇数次的数字为:" + i);
}
}
//方法2:将arr中所有元素进行异或,然后最后留下的数为奇数的元素,
//注意:仅适用于单个奇数次的出现,如果存在两个奇数次的则不适用
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum ^= arr[i];
}
System.out.println("数组中出现奇数次的数字为:" + sum);
}
}
拔高题
6、找数组平衡数
案例需求:判断数组中是否存在一个值,其左侧的值累加加和等于其右侧的值累加和,如果存在,找出这个值,如果不存在就显示不存在。
例如:[1,2,5,3,2,4,2],结果为:平衡数是3,因为3左边的1,2,5累加和是8,3右边的2,4,2累加和也是8。
[9, 6, 8, 8, 7, 6, 9, 5, 2, 5],结果是平衡数不存在。
参考答案:
public class Homework6 {
public static void main(String[] args) {
int[] arr = {9, 6, 8, 8, 7, 6, 9, 5, 2, 5};
//定义两个变量left,right来存储值的左右和
int count = 0;
for (int i = 0; i < arr.length; i++) {
int left = 0, right = 0;
//求左边和
for (int j = 0; j < i; j++) {
left += arr[j];
}
//求右边的和
for (int j = i + 1; j < arr.length; j++) {
right += arr[j];
}
if (left == right) {
System.out.println("平衡数存在为:" + i);
count++;
break;
}
}
if(count==0){
System.out.println("平衡数不存在");
}
}
}
7、左奇右偶
案例需求:现有一个长度为10的整数数组{26,67,49,38,52,66,7,71,56,87}。现在需要对元素重新排列,使得所有的奇数保存到数组左边,所有的偶数保存到数组右边。效果如图所示:
开发提示:左边的偶数与右边的奇数换位置
- 定义两个变量left和right,从左边开始查找偶数的位置,找到后用left记录,从右边开始找奇数的位置,找到后用right记录,如果left<right,那么就交换,然后在上一次的基础上继续查找,直到left与right擦肩。
参考答案:
public class Homework7 {
public static void main(String[] args) {
int[] arr = {26, 67, 49, 38, 52, 66, 7, 71, 56, 87};
/*定义两个变量left和right,从左边开始查找偶数的位置,找到后用left记录,
从右边开始找奇数的位置,找到后用right记录,如果left<right,那么就交换,
然后在上一次的基础上继续查找,直到left与right擦肩。*/
int left = 0, right = arr.length - 1;
while (left < right) {
while (arr[left] % 2 != 0) {
left++;
}
while (arr[right] % 2 == 0) {
right--;
}
if(left<right){
int x=arr[left];
arr[left]=arr[right];
arr[right]=x;
}
}
System.out.println(Arrays.toString(arr));
}
}
8、查找数组中个数过半的数字
案例需求:有一个长度为10的整型元素的数组arr,其中有一个元素出现次数超过n / 2,求这个元素。
int[] arr = {1, 2, 3, 2, 2, 2, 5, 4, 2};
开发提示:
- 对数组进行排序
- 取占据数组中间位置的元素,如果某个数字出现的次数过半,那么给数组排序后,这个数字一定会占据数组中间的位置
- 统计占据数组中间位置的元素实际出现的次数,这样就不用统计每一个数字出现的次数了
参考答案:
import java.util.Arrays;
public class Homework8 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 2, 2, 2, 5, 4, 2};
//冒泡排序将数组arr的数字从小到大进行排序
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[i] > arr[i + 1]) {
int x = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = x;
}
}
}
System.out.println(Arrays.toString(arr));
//定义一个变量middlenum来记录这个数组中间的数字
int middlenum = arr[arr.length / 2];
//定义一个变量count来记录数组中间的数字在数组中出现的次数
int count = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == middlenum) {
count++;
}
}
if (count > arr.length / 2) {
System.out.println(middlenum + "是数组个数过半的数字");
} else {
System.out.println("该数组没有个数过半的数字");
}
}
}
9、求数组中元素的最短距离
案例需求:随机产生10个[0,100)之间整数存储到数组中,找出数组中的两个元素x和y,使得(x - y)绝对值最小。
开发提示:
- 将数组进行排序
- 求相邻元素的差,差值最小值就是最短距离
参考答案:
import java.util.Arrays;
public class Homework9 {
public static void main(String[] args) {
int[] arr = new int[10];
for (int i = 0; i < 10; i++) {
arr[i] = (int) (Math.random() * 100) + 1;
}
System.out.println(Arrays.toString(arr));
//冒泡排序将arr数组从小到大进行排序
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int x = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = x;
}
}
}
System.out.println(Arrays.toString(arr));
//定义一个变量min来存储arr[i+1]-arr[i]的数,初始值为min=arr[1]-arr[0]
int minnum=arr[1]-arr[0];
int minIndex=0;
for (int i = 0; i < arr.length-1; i++) {
if(minnum>arr[i+1]-arr[i]){
minnum=arr[i+1]-arr[i];
minIndex=i;
}
}
System.out.println("差值最小的是第" + (minIndex+1) + "和第" + (minIndex + 2) + "个,他们的差值是:" + minnum);
}
}
tring(arr));
//定义一个变量min来存储arr[i+1]-arr[i]的数,初始值为min=arr[1]-arr[0]
int minnum=arr[1]-arr[0];
int minIndex=0;
for (int i = 0; i < arr.length-1; i++) {
if(minnum>arr[i+1]-arr[i]){
minnum=arr[i+1]-arr[i];
minIndex=i;
}
}
System.out.println("差值最小的是第" + (minIndex+1) + "和第" + (minIndex + 2) + "个,他们的差值是:" + minnum);
}
}