JAVA基础篇:笔试题----算法相关
数组、循环的部分分析:
1、 在提出一个问题时,如何输入多个不同的数来回答(通过for循环的次数)
举例:
Scanner input = new Scanner(System.in);
for(int i = 0;i<nums.length;i++){
nums[i] = input.nextInt();
}
2、为一个仅已知长度数组中的每个数都赋上有规律的值(for循环)
举例:
int [ ] nums = new int[6];
for(int i = 0;i<nums.length;i++){
nums[i] = =i+1;
}
3、如何处理随机出的数不重复的问题(此问题也是,在双重for循环进行比较时如何解决重复比较的问题,可以进行的优化之一)
(通过三个变量的互换实现将每一轮随机数(i)与数组最后一位数(-1-i)互换的形式,借此每次循环的范围都减去了上一轮循环的数,已解决重复随机数的问题)
举例:
Random random = new Random();
int index = -1;
int[ ] sysRedBall = new int[6];
int[ ]redBall = new int [33];
for(int i=0;i<redBall.length;i++){
redBall[i] = i;
for(int i=0;i<sysRedBall.length;i++) {
//sysRedBall数组中一共有六位红球
index = random.nextInt(redBall.length-i);
//index获取每一轮的随机数,-i代表每一轮减少最后一个下标的赋值借此取消重复的数
sysRedBall[i] = redBall[index];
//为数组进行赋值
int temp = redBall[index];
redBall[index] = redBall[redBall.length-1-i];
redBall[redBall.length-1-i] = temp;
//通过三个变量的互换实现将每一轮随机数与数组最后一位数互换的形式,借此每次循环的范围都减去了上一轮循环的数,已解决重复随机数的问题
}
4、如何快速输出一个数组里的最值
举例(最大值):
int n = nums[0];
int[ ] nums ={1,2,3,4,5};
for(int i=0;i<nums.length;i++) {
n = n>nums[i]?n:nums[i];
}
System.out.println("最大的数"+n);
(以上例子在已加入变量的情况下分析)
五子棋代码的编写
//分析需求
/* 建立棋盘,用数组的方式建立棋盘,第一行和第一列分别赋值为0~16,
* 显示棋盘
* 用户是通过输入每行每列的数值的情况下进行下棋,为x,y两个变量
* 判断下棋位置是否有棋子,以及附加上赢棋的情况下结束比赛的判定
* 黑白子的轮流下棋形式,通过放在一个循环里,每轮都前后执行的方式体现
* 最后附加赢棋的条件,行列或斜四个棋子的情况下,下一步的落子是黑还是白是否相同
*/
//声明变量
/* 变量i,j为原先棋盘上所代表的数字0,1,2
* 变量x,y代表输入棋子时的横,纵坐标
*/
//变量赋值
/* i,j 代表棋盘横纵轴赋值0,16
* x,y 由用户输入
*/
//业务处理
/* 四个类为:
* 双方下棋的循环(进行已下完棋子的处理),
* 显示棋盘,(棋盘横纵轴的对齐)
* 判断是否有棋子
* 判断输赢(当横纵斜向的四子均为黑(白)的棋子时,下一颗棋子的是否仍为黑(白))
*/
package kaikela04;
import java.util.Scanner;
public class Demo3 {
public static void main(String[] args) {
int[][] map = new int[16][16];
for(int i=0;i<16;i++) {
map[0][i]=i;
map[i][0]=i;
}
//为棋盘增加横轴纵轴,并赋值
int x,y;
Scanner input = new Scanner(System.in);
Show(map);
while(true) {
do {
System.out.println("请黑方落子(格式:行数 列数)");
x = input.nextInt();
y = input.nextInt();
//输入两次,x为行数,y为列数
}while(!IsEmpty(map,x,y)) ;
map[x][y]=1;
//判断当没有棋子时,输入黑棋的1
Show(map);
//显示棋盘
if(!Win(map)) {
break;
//每输入一枚棋子判断一次胜负
}
do {
System.out.println("请白方落子(格式:行数 列数)");
x = input.nextInt();
y = input.nextInt();
}while(!IsEmpty(map,x,y)) ;
//当判断没有棋子时,输入白旗的2
map[x][y]=2;
Show(map);
if(!Win(map)) {
//其中!是属于boolean类型判断的逻辑运算符(非),win(map)输出结果为false,倘若不一样,则游戏结束
break;
//如果赢了,结束对局
}
}
}
public static void Show(int map[][]) {
for(int i=0;i<16;i++) {
for(int j=0;j<16; j++) {
if((i==0 && j>9) || (j==0 && i>9)) {
System.out.print(map[i][j]+" ");
}else {
System.out.print(map[i][j]+" ");
}
}
System.out.println();
}
}
//此处是优化横、纵轴处理个位数,双位数相互对齐做出的调整,并显示棋盘
public static boolean IsEmpty(int[][]map,int x,int y) {
if(map[x][y] == 0) {
return true;
//判断棋子所在坐标是否为0,既是判断是否有棋子
}
System.out.println("此位置已有棋子,请重新输入");
return false;
}
//判断是否接下来的下棋位置是否有棋子,若为0没有棋子输出true。否则,则代表已下完棋子则输出false
public static boolean Win(int map[][]) {
for(int i=1;i<12;i++) {
//i=1,为了排除纵轴的1,2,对于黑白棋由1,2表达的结果产生的影响
for(int j=1;j<12;j++) {
//j=1为了排除横轴的1,2对于黑白棋由1,2表达产生的结果影响
//i,j都小于12是因为,当最边缘连成四子时无法接着步子,所以无法获胜
if(map[i][j]==1) {
if(map[i][j+1]==1 && map[i][j+2]==1 && map[i][j+3]==1 && map[i][j+4]==1
//新下的子,倘若与横向连成的四子都为1获胜
|| map[i+1][j]==1 && map[i+2][j]==1 && map[i+3][j]==1 && map[i+4][j]==1
//或者新下的子倘若与纵向连成的四子都为1也获胜
|| map[i+1][j+1]==1 && map[i+2][j+2]==1 && map[i+3][j+3]==1 && map[i+4][j+4]==1) {
//或者新下的子与斜向连成的四子都为1也获胜
System.out.println("黑棋获胜");
return false;
}
}else if(map[i][j]==2) {
if((map[i][j+1]==1 && map[i][j+2]==1 && map[i][j+3]==1 && map[i][j+4]==1
//白子判定条件同上
|| map[i+1][j]==1 && map[i+2][j]==1 && map[i+3][j]==1 && map[i+4][j]==1
|| map[i+1][j+1]==1 && map[i+2][j+2]==1 && map[i+3][j+3]==1 && map[i+4][j+4]==1)) {
System.out.println("白棋获胜");
return false;
//上处循环当为true时才继续,所以输出false,则结束循环
}
}
}
}
return true;
//没得出结果时,不断下棋进行循环
}
}