几道面试题

Posted stoneandatao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了几道面试题相关的知识,希望对你有一定的参考价值。

问:如何在大量数据中找到最大的5个?

思路:new一个5个元素的空数组,里面存的一直都是最大的5个,利用binarySearch(二分法)方法找到每个数据应该插入的位置。

 

 1 public static void main(String[] args) 
 2         int[] arr = new int[5];
 3         Random random = new Random();
 4         for(int i = 0; i < 1000000000; i++) 
 5             int num = random.nextInt();
 6             int index = Arrays.binarySearch(arr, num);
 7             //如果num是最小的,跳过
 8             if(index == 0 || index == -1) continue;
 9             //如果是未出现的数
10             if(index < 0)index = -(index+1);
11             //让index位置之前的数都往前挪一位
12             for(int j = 1; j < index; j++) 
13                 arr[j - 1] = arr[j];
14             
15             //把num放进去
16             arr[index - 1] = num;
17         
18         
19         System.out.println(Arrays.toString(arr));
20     

 

问:如何统计字符串中大写英文字母的个数?

 1 public static void countLetters(String str) 
 2         int[] arr = new int[26];
 3         for(int i = 0; i < str.length(); i++) 
 4             char c = str.charAt(i);
 5             //如果是大写英文字母
 6             if(c >= ‘A‘ && c <= ‘Z‘) 
 7                 //该英文字母的数量加1
 8                 arr[c-‘A‘]++;
 9             
10         
11         System.out.println(Arrays.toString(arr));
12     

 

问:利用生产消费者模型实现异步日志

 1 public class Logger 
 2 
 3     private LinkedBlockingQueue<String> queue;
 4     private PrintWriter out;
 5 
 6     public Logger() 
 7         //给个初始容量
 8         queue = new LinkedBlockingQueue<>(10000);
 9     
10     
11     public void open() 
12         try 
13             //打开一个文件
14             out = new PrintWriter("log.txt");
15             //开一条线程工作
16             Thread t = new Thread() 
17                 @Override
18                 public void run() 
19                     while(true) 
20                         writeFile();
21                     
22                 
23             ;
24 //        t.setDaemon(true);
25             t.start();
26          catch (Exception e) 
27             e.printStackTrace();
28         
29     
30     
31     //关闭输出流
32     public void close() 
33         out.close();
34     
35     
36     //往文件里写日志
37     private void writeFile() 
38         try 
39             //从阻塞队列中取出字符串
40             String str = queue.take();
41             out.println(str);
42             out.flush();
43             System.out.println("写日志:" + str);
44          catch (InterruptedException e) 
45             e.printStackTrace();
46         
47     
48     
49     //往阻塞队列中放日志
50     public void putFile(String log) 
51         try 
52             queue.put(log);
53          catch (InterruptedException e) 
54             e.printStackTrace();
55         
56     
57 

测试类:

public class TestLogger 

    public static void main(String[] args) 
        Logger logger = new Logger();
        // 开启写日志工作(等待状态)
        logger.open();
        // 塞东西
        for (int i = 0; i < 1000; i++) 
            logger.putFile("I LOVE YOU");
        

        //流实在是太慢了,我们等一会,等它把日志写进文件再关
        try 
            Thread.sleep(2000);
         catch (InterruptedException e) 
            e.printStackTrace();
        

        // 关流
        logger.close();
    

 

以上是关于几道面试题的主要内容,如果未能解决你的问题,请参考以下文章

周三面试Python开发,这几道Python面试题差点答错,Python面试题No7

这几道tomcat面试题,最后两道难倒我了

几道面试题

几道面试题

大厂面试常见的几道SQL题,看你能答吗?

分享几道Java线程面试题