今天由于是线上面试,我不太紧张,所以其实对于整个面试过程来说,还可以,问的除了这道三个知识面结合的算法题其他都挺简单,聊着聊着我和这个项目经理求教,他也很耐心,并没有因为我的追问而感到疲惫,很感激他,虽然可能会因为这道综合题导致面试的失败,但是我觉得我有很大的收获。
题目:利用多线程,实现对26个英文字母与数字的6位组合全部可能性的打印输出,打印全部可能的时间不得超过两个小时。
我的解答(有很大问题,时间保证不了而且多线程没有设置线程结束标志,循环无法停止,仅仅实现输出组合的算法,21亿多组可能性,我算是完全败在这个题上了哈哈哈哈哈)
我设置将结果输出到windows的桌面里的txt文件,代码如下:
import java.io.*;
import java.util.HashMap;
import java.util.Random;
/*多线程交替打印数字与字母组合,一个组合6位,打印所有的组合可能结果*/
public class Print {
//可能会找不到文件,所以需要在构造方法上抛出异常
public Print() throws FileNotFoundException {
}
//利用hashmap记录全部的结果便于排除重复项(好傻,21亿多结果,hashmap性能可行吗?我真傻啊)
static HashMap<Integer,String> hashMap = new HashMap<>();
//本来以为随机生成之后再排除重复就能得到所有的结果,但是在时间上这个随机生成的效率真的太拉了。
static Random random = new Random();
static boolean flag = false;
static int sign = 0;
/*打印流需要指定打印输出的位置*/
PrintStream ps = new PrintStream("C:\\Users\\Dell\\Desktop\\test.txt");
/*写一个打印的方法*/
public String getString(int length){
//StringBuffer的线程安全,几乎全部的方法都用了同步关键字,而StringBriluder无同步线程不安全但是效率高。
StringBuffer get = new StringBuffer();
for(int i=0;i<length;i++){
//判断生成字母还是数字
boolean isChar = (random.nextInt(2)%2 == 0);
if (isChar){
int Char = random.nextInt(2)%2 == 0 ?65:97;
//字符串拼接方法直接拼接
get.append((char) (Char+random.nextInt(26)));
}else
get.append(Integer.toString(random.nextInt(10)));
}
//返回缓冲区里的字符串,其实这个我觉得也会增大结果全部出现的时间。
return get.toString();
}
public void setMap(){
/*向系统定向输出位置*/
System.setOut(ps);
//这个循环我没有设置退出标志flag的值变化,所以不可能停下来!!!早知道改改了,直接就交了真呆啊我
while(!flag){
String string = getString(6);
/*判断哈希map里是否存在这个组合*/
if(hashMap.containsValue(string)){
setMap();
}else {
hashMap.put(sign,string);
System.out.print(Thread.currentThread().getName()+"打印字母与数字组合:");
System.out.println(string);
sign++;
}
}
}
}
//实现Runnable接口
class Threads implements Runnable{
Print print = new Print();
Threads() throws FileNotFoundException {
}
@Override
public void run() {
print.setMap();
}
public static void main(String[] args) throws FileNotFoundException {
Threads threads = new Threads();
new Thread(threads,"线程A").start();
new Thread(threads,"线程B").start();
}
}
运行图片:
真的,这一道题把我打回原形!!!框架学的熟悉也没什么错,错就错在对多线程和java基础的普及面花的时间太少了。
后续会跟进项目经理教给我的方法。