文章目录
巩固题
1、随机产生偶数并排序
案例需求:随机产生10个[1,100]之间的偶数存储到数组中,并按照从小到大排序输出。
开发提示:
- 随机产生[1,50]范围内的整数 * 2 就能得到[1,100]之间的偶数
参考答案:
public class Homework1 {
public static void main(String[] args) {
int[] arr = new int[10];
//随机产生10个[1,100]的偶数
for (int i = 0; i < arr.length; i++) {
/*
Math.random():[0,1)的小数
Math.random()*50:[0,50)的小数
Math.random()*50+1:[1,51)的小数
(int)(Math.random()*50 + 1):[1,51)的整数,即[1,50]的整数
(int)(Math.random()*50 + 1) * 2 : [1,100]的偶数
*/
arr[i] = (int)(Math.random()*50 + 1) * 2;
}
//排序
for (int i = 1; i < arr.length; i++) {
for(int j=0; j<arr.length - i; j++){
if(arr[j] > arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
//显示结果
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
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 input = new Scanner(System.in);
System.out.print("请输入一个英语单词:");
String word = input.next(); //假如输入的英语单词是mom
input.close();
char[] wordCharArray = word.toCharArray(); // wordCharArray字符数组内容是{'m','o','m'}
//(1)先假设它是对称的
boolean flag = true;
//(2)遍历,查看数组的元素是否首尾对称
//left表示左边的下标
//right表示右边的下标
for(int left=0,right=wordCharArray.length-1; left<right; left++,right--){
if(wordCharArray[left] != wordCharArray[right]){
flag = false;
break;
}
}
if(flag){
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 input = new Scanner(System.in);
System.out.print("请录入本组学员人数:");
int count = input.nextInt();
int[] grades = new int[count];
String[] names = new String[count];
for (int i = 0; i < grades.length; i++) {
System.out.print("第" + (i+1) + "个学员的姓名:");
names[i] = input.next();
System.out.print("第" + (i+1) + "个学员的成绩:");
grades[i] = input.nextInt();
}
input.close();
//输出学员姓名和成绩
System.out.println("所有学员的成绩如下:");
for (int i = 0; i < names.length; i++) {
System.out.println(names[i] + ":" + grades[i]);
}
//查找满分学员
System.out.println("本班满分学员:");
boolean flag = false;
for(int i=0; i<grades.length; i++){
if(grades[i] == 100){
System.out.println(names[i]);
flag = true;
}
}
if(!flag){
System.out.println("没有");
}
}
}
4、查字
案例需求:公司年会有一个寻找锦鲤的游戏,每一个员工随意写一个字,如果在“锦鲤”词库中有这个字,那么就奖励500元锦鲤红包,否则就没有,每人只能玩一次。
现有锦鲤字库如下,它们按照Unicode编码值从小到大排序:
char[] koiFishWords = {'一','今','地','定','尚','年','开','我','果','火','爱','硅','结','花','谷','遍'};
开发提示:
(1)使用顺序查找
(2)使用二分查找:效率更高,因为koiFishWords是有序的数组
参考答案:
import java.util.Scanner;
public class Homework4 {
public static void main(String[] args) {
char[] koiFishWords = {'一','今','地','定','尚','年','开','我','果','火','爱','硅','结','花','谷','遍'};
Scanner input = new Scanner(System.in);
System.out.print("请输入一个字:");
char word = input.next().charAt(0);
input.close();
int index = -1;
for(int left = 0,right = koiFishWords.length-1; left<=right; ){
//int mid = (left+right)/2;
int mid = left + (right-left)/2;
if(koiFishWords[mid] == word){
index = mid;
break;
}else if(word > koiFishWords[mid]){
//说明target在[mid]右边
left = mid+1;
}else{
//说明target<arr[mid],target在[mid]左边
right= mid-1;
}
}
if(index!=-1){
System.out.println("你是锦鲤!!!恭喜获得锦鲤红包500元");
}else{
System.out.println("o(╥﹏╥)o");
}
}
}
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 Homework5 {
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};
int num = arr[0];
for (int i = 1; i < arr.length; i++) {
num ^= arr[i];
}
System.out.println("出现奇数次的是:" + num);
}
}
拔高题
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 = {1,2,5,3,2,4,2};
// int[] arr = {9, 6, 8, 8, 7, 6, 9, 5, 2, 5};
boolean flag = false;
for (int mid = 0; mid < arr.length; mid++) {
int leftSum = 0;
int rightSum = 0;
for (int i = 0; i <mid; i++) {
leftSum += arr[i];
}
for (int i = mid+1; i < arr.length; i++) {
rightSum += arr[i];
}
if(leftSum==rightSum) {
System.out.println("平衡数是" + mid);
flag = true;
}
}
if(!flag){
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};
for (int left = 0,right = arr.length-1; left < right; ){
//left代表左边需要交换的数的下标,偶数的下标
//如果arr[left]此时是奇数,说明此时left不是我们要找的下标,left++往后移动
while(arr[left]%2!=0){//当arr[left]是偶数时,结束while循环
left++;
}
//如果arr[right]此时是偶数,说明此时right不是我们要找的下标,right--往前移动
while(arr[right]%2==0){//当arr[right]是奇数时,结束while循环
right--;
}
if(left < right){
int temp = arr[left];
arr[left] = arr[right];
arr[right]= temp;
}
}
//输出结果
System.out.print("数组调整后:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
8、查找数组中个数过半的数字
案例需求:有一个长度为10的整型元素的数组arr,其中有一个元素出现次数超过n / 2,求这个元素。
int[] arr = {1, 2, 3, 2, 2, 2, 5, 4, 2};
开发提示:
- 对数组进行排序
- 取占据数组中间位置的元素,如果某个数字出现的次数过半,那么给数组排序后,这个数字一定会占据数组中间的位置
- 统计占据数组中间位置的元素实际出现的次数,这样就不用统计每一个数字出现的次数了
参考答案:
public class Homework8 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 2, 2, 2, 5, 4, 2};
//从小到大排序
for (int i = 1; i < arr.length; i++) {
for (int j = 0; j < arr.length - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
//取中间元素,因为如果某个数个数过半,那么排序后,这个数一定会占据中间位置
int mid = arr[arr.length / 2];
//统计占据数组中间位置的元素出现的次数
int count = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == mid) {
count++;
}
}
if (count > arr.length / 2) {
System.out.println("数组中个数过半的是:" + mid + ",共出现了" + count + "次");
} else {
System.out.println("数组中不存在个数过半的数字");
}
}
}
9、求数组中元素的最短距离
案例需求:随机产生10个[0,100)之间整数存储到数组中,找出数组中的两个元素x和y,使得(x - y)绝对值最小。
开发提示:
- 将数组进行排序
- 求相邻元素的差,差值最小值就是最短距离
参考答案:
public class Homework9 {
public static void main(String[] args) {
int[] arr = new int[10];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int)(Math.random()*100);
}
//从小到大排序
for (int i = 1; i < arr.length; i++) {
for (int j = 0; j < arr.length - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
//显示元素
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
int min = Math.abs(arr[1] - arr[0]);
for (int i = 1; i < arr.length - 1; i++) {
int dis = Math.abs(arr[i+1] - arr[i]);
if(dis < min){
min = dis;
}
}
System.out.println("最短距离是:" + min);
}
}