无意看到某次面试没有通过后,在家苦练基本功后重新写的一串代码。
方法千万种,以下是我印象最深的,回头看还是觉得挺有学习意义的,所以发出来共享学习。
原问题条件不记得太清,大致实现的是:随机生成九宫格图形(手势)密码
读题,有几个点需要主要:
1、密码长度可设置
2、手势密码的路径必须可直达
用两种方式实现:
1、canArr 判断前后数值是否可直达
2、getNum 根据前一个数值获取下一个数值
package com.maomao;
import org.testng.annotations.Test;
import java.util.HashMap;
import java.util.Map;
//随机生成九工格图形密码,随机数范围1~9
public class RandomScret {
//9工格中,1~9可直达的数值,发现规律
//除了5
//奇数,1,3,7,9,四个角无法直达
//偶数,2,4,6,8,对角无法直达,并且对角和5的差值相同
// int[] num_1={2,4,5,6,8};
// int[] num_2={1,3,4,5,6,7,9};
// int[] num_3={2,4,5,6,8};
// int[] num_4={1,2,3,5,7,8,9};
// int[] num_5={1,2,3,4,6,7,8,9};
// int[] num_6={1,2,3,5,7,8,9};
// int[] num_7={2,4,5,6,8};
// int[] num_8={1,3,4,5,6,7,9};
// int[] num_9={2,4,5,6,8};
//获取1~9的随机整数
//( n~m随机数公式:(int)(Math.random()*(m-n+1) +n)))
public static int getRandomNum(){
int num=(int)(Math.random()*9+1);
return num;
}
//判断是否可以抵达 -----这种方式需要不停试错,花费时间较长
public Boolean canArr(int preNum,int randomNum){
//做标记,默认不可以抵达
boolean flag = false;
//前后值不能相等
if (preNum!=randomNum){
if (preNum==5 ) {
flag = true;
}else if (randomNum==5){
flag = true;
}else if (preNum%2==0){ //是偶数
int n=Math.abs(preNum-5);
int m=Math.abs(randomNum-5);
if (n!=m){
flag=true;
}
}else if (preNum%2==1){ //preNum是除了5以外的奇数
if (randomNum%2==0){
flag=true;
}
}
}
return flag;
}
//构造可直达路径 ------这种方式占用内存,花费时间短
public Map<Integer,int[]> All() {
Map<Integer, int[]> map = new HashMap<>();
map.put(1,new int[]{2,4,5,6,8});
map.put(2,new int[]{1,3,4,5,6,7,9});
map.put(3,new int[]{2,4,5,6,8});
map.put(4,new int[]{1,2,3,5,7,8,9});
map.put(5,new int[]{1,2,3,4,6,7,8,9});
map.put(6,new int[]{1,2,3,5,7,8,9});
map.put(7,new int[]{2,4,5,6,8});
map.put(8,new int[]{1,3,4,5,6,7,9});
map.put(9,new int[]{2,4,5,6,8});
return map;
}
public int getNum(int preNum){
// int tag=(int)(Math.random()*10);
int[] nextArr=All().get(preNum);
int tag=(int)(Math.random()*10+1);//1~10
int next=nextArr[tag%nextArr.length];
return next;
}
@Test
public void test1(){
RandomScret rs=new RandomScret();
//设置密码长度length
int length=6;
int[] scret=new int[length];
//指定生成
int preNum=getRandomNum();
for (int i=0;i<length;i++){
scret[i]=rs.getNum(preNum);
preNum=scret[i];
}
for (int num:scret){
System.out.println(num);
}
}
@Test
public void test2(){
RandomScret rs=new RandomScret();
//设置密码长度length
int length=6;
int[] scret=new int[length];
//随机生成
int preNum=getRandomNum();
for (int i=0;i<length;){
int randomNum=getRandomNum();
if (rs.canArr(preNum,randomNum)){
scret[i]=randomNum;
preNum=scret[i];
i++;
}else {
continue;
}
}
for (int num:scret){
System.out.println(num);
}
}
}
来源:oschina
链接:https://my.oschina.net/u/4340589/blog/4277121