目录
1. 案例一:逢 7 跳过
2. 案例二:数组元素求和
3. 案例三:判断两个数组是否相同⭐
4. 案例四:查找元素在数组中的索引
5. 案例五:数组元素反转
6. 案例六:评委打分
7. 案例七:随机产生验证码
8. 面试题⭐
1. 案例一:逢 7 跳过
需求:
朋友聚会的时候可能会玩一个游戏:逢七过。
规则是:从任意一个数字开始报数,当你要报的数字包含7或者是7的倍数时都要说:过。
为了帮助大家更好的玩这个游戏,这里我们直接在控制台打印出1-100之间的满足逢七必过规则的数据。
public class Test1 {
public static void main(String[] args) {
knockSeven();
}
/*
需求: 在控制台打印出 1~100 之间满足逢七过规则的数据
分析:
1. 通过循环获取到1~100之间的每一个数字
2. 数值拆分, 拆分出个位和十位
3. 根据规则加入if判断
if(ge == 7 || shi == 7 || i % 7 == 0)
4. 打印出满足规则的数据
*/
public static void knockSeven() {
// 1. 通过循环获取到1~100之间的每一个数字
for(int i = 1; i <= 100; i++){
// 2. 数值拆分, 拆分出个位和十位
int ge = i % 10;
int shi = i / 10 % 10;
// 3. 根据规则加入if判断
if(ge == 7 || shi == 7 || i % 7 == 0){
// 4. 打印出满足规则的数据
System.out.println(i);
}
}
}
}
2. 案例二:数组元素求和
需求:
有这样的一个数组,元素是 {68,27,95,88,171,996,51,210}
求出该数组中满足要求的元素和
要求是:求和的元素个位和十位都不能是7,并且只能是偶数
public class Test2 {
public static void main(String[] args) {
int[] arr = {68, 27, 95, 88, 171, 996, 51, 210};
int evenNumberSum = getEvenNumberSum(arr);
System.out.println(evenNumberSum);
}
/*
需求 :
有这样的一个数组,元素是 {68,27,95,88,171,996,51,210}
求出该数组中满足要求的元素和
要求是:求和的元素个位和十位都不能是7,并且只能是偶数
*/
public static int getEvenNumberSum(int[] arr) {
// 1. 定义求和变量
int sum = 0;
// 2. 遍历数组, 获取到内部的每一个元素
for (int i = 0; i < arr.length; i++) {
// arr[i] : 数组中的每一个元素
// 3. 将每一个元素, 拆分出个位, 十位
int ge = arr[i] % 10;
int shi = arr[i] / 10 % 10;
// 4. 判断
if(ge != 7 && shi != 7 && arr[i] % 2 == 0){
// 5. 求和
sum += arr[i];
}
}
return sum;
}
}
3. 案例三:判断两个数组是否相同⭐
1. 基本数据类型 : 比较数据值
2. 引用数据类型 : 比较地址值
需求:
定义一个方法,用于比较两个数组的内容是否相同
要求 : 长度, 内容, 顺序完全相同
package com.itheima.test;
public class Test3 {
/*
== :
1. 基本数据类型 : 比较数据值
2. 引用数据类型 : 比较地址值
*/
public static void main(String[] args) {
int[] arr1 = {11, 22, 33};
int[] arr2 = {11, 22, 33, 44};
boolean result = checkArrayContent(arr1, arr2);
System.out.println(result);
}
/*
需求: 定义一个方法, 比较两个数组的内容是否相同
要求: 长度, 内容, 顺序完全相同
*/
public static boolean checkArrayContent(int[] arr1, int[] arr2) {
// 1. 比较两个数组的长度
if (arr1.length != arr2.length) {
return false;
}
// 2. 比较两个数组的元素内容
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]) {
return false;
}
}
// 3. 如果代码能够走到这里, 代表两个数组长度, 内容, 顺序完全相同
return true;
}
}
4. 案例四:查找元素在数组中的索引
需求:
设计一个方法, 查找元素在数组中的索引位置
已知一个数组 arr = {19, 28, 37, 46, 50};
键盘录入一个数据,查找该数据在数组中的索引。
并在控制台输出找到的索引值。
如果没有查找到,则输出-1
public class Test4_1 {
public static void main(String[] args) {
int[] arr = {19, 28, 37, 46, 50};
Scanner sc = new Scanner(System.in);
System.out.println("请输入您要查找的元素:");
int num = sc.nextInt();
int index = getIndex(num, arr);
System.out.println(index);
}
/*
需求:
设计一个方法, 查找元素在数组中的索引位置
查找元素, 在数组中第一次出现的索引位置.
已知一个数组 arr = {19, 28, 37, 46, 50};
键盘录入一个数据,查找该数据在数组中的索引。
并在控制台输出找到的索引值。
如果没有查找到,则输出-1
*/
public static int getIndex(int num, int[] arr) {
// 1. 假设要查找的元素, 在数组中就是不存在的
int index = -1;
// 2. 遍历数组, 获取内部的每一个元素
for (int i = 0; i < arr.length; i++) {
// 3. 比较
if (arr[i] == num) {
// 4. 找到了, 让index变量记录正确的索引位置
index = i;
break;
}
}
return index;
}
}
5. 案例五:数组元素反转
需求:
已知一个数组 arr = {11, 22, 33, 44, 55}; 用程序实现把数组中的元素值交换,
交换后的数组 arr = {55, 44, 33, 22, 11}; 并在控制台输出交换后的数组元素。
public class Test5 {
/*
已知一个数组 arr = {11, 22, 33, 44, 55}; 用程序实现把数组中的元素值交换,
交换后的数组 arr = {55, 44, 33, 22, 11}; 并在控制台输出交换后的数组元素。
1. 确定好谁跟谁换
第一个和倒数第一个 : arr[0] arr[arr.length-1-0]
第二个和倒数第二个 : arr[1] arr[arr.length-1-1]
第三个和倒数第三个 : arr[2] arr[arr.length-1-2]
...
arr[i] arr[arr.length-1-i]
2. 定义三方变量, 套入公式
*/
public static void main(String[] args) {
int[] arr = {11, 22, 33, 44, 55};
reverseArray2(arr);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
private static void reverseArray2(int[] arr) {
for(int start = 0, end = arr.length - 1; start < end; start++, end--){
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
}
private static void reverseArray1(int[] arr) {
for (int i = 0; i < arr.length / 2; i++) {
int temp = arr[i];
arr[i] = arr[arr.length-1-i];
arr[arr.length-1-i] = temp;
}
}
}
6. 案例六:评委打分
需求:
在编程竞赛中,有6个评委为参赛的选手打分,分数为0-100的整数分。
选手的最后得分为:去掉一个最高分和一个最低分后
import java.util.Scanner;
public class Test6 {
/*
需求:
在编程竞赛中,有6个评委为参赛的选手打分,分数为0-100的整数分。
选手的最后得分为:去掉一个最高分和一个最低分后 的4个评委平均值
1. 基本实现 (不考虑分数校验)
2. 校验键盘录入的分数是否是0~100之间
3. 抽取方法
*/
public static void main(String[] args) {
int[] arr = initData();
int sum = getSum(arr);
int max = getMax(arr);
int min = getMin(arr);
// 5. 求平均分 (总合 - 最大值 - 最小值) / 4
double avg = ((sum - max - min) * 1.0) / (arr.length - 2);
System.out.println("选手的最后得分为:" + avg);
}
/**
* 数组中找最小值
*/
private static int getMin(int[] arr) {
// 4. 求最小值
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
return min;
}
/**
* 数组中找最大值
*/
private static int getMax(int[] arr) {
// 3. 求最大值
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
/**
* 数组求和
*/
private static int getSum(int[] arr) {
// 2. 求和
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum;
}
/**
* 此方法用于键盘录入6个评委的分数
*/
private static int[] initData() {
int[] arr = new int[6];
// 1. 键盘录入6个评委的打分
Scanner sc = new Scanner(System.in);
System.out.println("请输入6个评委的打分:");
for (int i = 0; i < arr.length; i++) {
System.out.println("请输入第" + (i + 1) + "位评委的打分:");
int score = sc.nextInt();
// 判断成绩是否正确
if (score >= 0 && score <= 100) {
arr[i] = score;
} else {
System.out.println("您的分数输入有误, 请检查是否是0~100之间的");
i--;
}
}
return arr;
}
}
7. 案例七:随机产生验证码
import java.util.Random;
import java.util.Scanner;
public class Test7 {
/*
需求: 请从26个英文字母(大小写都包含),以及数字0-9中,随机产生一个5位的字符串验证码并打印在控制台
效果: uYq8I,3r4Zj
注意事项: 打印字符类型数组名, 不会看到地址值, 而是元素的内容
*/
public static void main(String[] args) {
char[] chs = getContents();
String checkCode = getCheckCode(chs);
System.out.println("产生的验证码为:" + checkCode);
}
private static String getCheckCode(char[] chs) {
Random r = new Random();
String checkCode = "";
for(int i = 1; i <= 5; i++){
int randomIndex = r.nextInt(chs.length);
checkCode += chs[randomIndex];
}
return checkCode;
}
private static char[] getContents() {
char[] chs = new char[26 + 26 + 10];
int index = 0;
for(char c = 'a'; c <= 'z'; c++){
chs[index] = c;
index++;
}
for(char c = 'A'; c <= 'Z'; c++){
chs[index] = c;
index++;
}
for(char c = '0'; c <= '9'; c++){
chs[index] = c;
index++;
}
return chs;
}
}
8. 面试题⭐
面试题: 实现两个变量的数据交换, 不允许定义第三方变量
使用异或实现
/*
^ 异或 :
特点:
1. 相同为false, 不同为true
2. 一个数字, 被另外一个数字异或两次, 该数本身不变
异或操作数值的运算过程 :
1. 将需要运算的数据, 转换为二进制数据
0000 1010 10
0000 0101 5
2. 将二进制数据的0当做为false, 1当做为true, 运算
0000 1010
^ 0000 0101
--------------------
0000 1111
3. 将运算后的二进制数据, 转换为十进制
*/
public class SwapDemo1 {
/*
思路: 今后只要涉及到数据交换, 联想到第三方的变量
int a = 10;
int b = 20;
int c = a;
a = b;
b = c;
System.out.println("a=" + a); // 20
System.out.println("b=" + b); // 10
*/
public static void main(String[] args) {
int a = 10;
int b = 20;
a = a ^ b; // a = 10 ^ 20;
b = a ^ b; // b = 10 ^ 20 ^ 20; b = 10
a = a ^ b; // a = 10 ^ 20 ^ 10; a = 20
System.out.println("a=" + a); // 20
System.out.println("b=" + b); // 10
}
}
import java.util.Random;
public class RandomDemo {
/*
从数组中随机取出一个元素
根据数组的长度, 产生一个随机数, 拿着这个随机数, 当做索引去数组中获取元素
*/
public static void main(String[] args) {
String[] sArr = {"米饭", "馒头", "包子", "麻花", "面条"};
// 0 1 2 3 4
Random r = new Random();
int i = r.nextInt(sArr.length); // 0 1 2 3 4
System.out.println(i);
System.out.println(sArr[i]);
}
}