面试奇遇:多线程+算法+java基础

今天由于是线上面试,我不太紧张,所以其实对于整个面试过程来说,还可以,问的除了这道三个知识面结合的算法题其他都挺简单,聊着聊着我和这个项目经理求教,他也很耐心,并没有因为我的追问而感到疲惫,很感激他,虽然可能会因为这道综合题导致面试的失败,但是我觉得我有很大的收获。

题目:利用多线程,实现对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基础的普及面花的时间太少了。

后续会跟进项目经理教给我的方法。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ForestSpringH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值