第一次面试的上机题目

时间:2022-07-05 16:36:45

 今天去一家公司面试,一开始就做上机题目,题目很简单,拿到我就有思路,但是到自己真正要去写的时候发现,下笔就错,很多细节问题以前都没考虑到,花了1个小时才把勉勉强强的做出来,大把错误,哎!,都怪自己平时动手太少,从今天开始多动手,立下一个flag;

今天把题目重新做了一下,题目如下:

读取read.txt文件
1.最小和最大的price 和对应的time
2.出现次数最多的price 和对应的time
3.按price去重后的size

read.txt的格式是name:xx,price:xx,time:xx,看起来像json字符串,这种形式的之前没写过直接上代码了

思路是把每一行的数据封装成一个对象;然后放入list中进行处理

 实体类非常简单,略过了;

读取文件

 1 public List<Item> read(File file) {
 2         List<Item> list = new ArrayList();
 3          try {
 4              System.out.println("开始读取");
 5             BufferedReader  bd = new  BufferedReader( new FileReader(file));            
 6             while(bd.read()!= -1) {//使用read判断,会读取第一个字符,再调用readLine会从第二个字符出开始读,
 7                 
 8                 String readLine = bd.readLine();
 9                 //对String进行分割
10                 Item item = new Item();
11                 String[] line = readLine.split(",");
12                 for( String str:line) {
13                     String[] split = str.split(":");
14                     if(split[0].equals("name")) {
15                         item.setUsername(split[1]);
16                                     
17                     }else if(split[0].equals("price")) {
18                      item.setPrice(Double.valueOf(split[1]));                     
19                     }else {
20                          item.setTime(split[1]);                        
21                     }
22                     
23                 }
24                 list.add(item);
25             }
26         } catch (FileNotFoundException e) {
27             // TODO Auto-generated catch block
28             e.printStackTrace();
29         } catch (IOException e) {
30             // TODO Auto-generated catch block
31             e.printStackTrace();
32         }
35         return list;
36     }

  这里有一个小问题,我们在使用bd.read()!= -1的时候其实已经将文件第一个字符读取了,再调用readLine方法时会导致第一个字符没有,我找了好久也没有找到好的解决方法,只能就txt文件第一行空出来处理

 1.最小和最大的price 和对应的time

 

//1.最小和最大的price 和对应的time
    public void first(List<Item> list) {
        double maxPrice=0.0;
        String maxTime=null;
        
         for(int j=0;j<list.size();j++) {
              if( list.get(j).getPrice()>maxPrice) {
                  maxPrice = list.get(j).getPrice();
                  maxTime = list.get(j).getTime();
              }
          }        
         double minPrice=maxPrice;
         String minTime=null;  ;
         for(int j=0;j<list.size();j++) {
              if( list.get(j).getPrice()<minPrice) {
                  minPrice = list.get(j).getPrice();
                  minTime = list.get(j).getTime();
              }
          }        
             System.out.println("最"+maxPrice+" "+maxTime);    
             System.out.println("最小"+minPrice+" "+minTime);    
        }

题目很简单,但是如果写的不多,遇到for循环想半天,时间浪费很多;

2.出现次数最多的price 和对应的time

//出现次数最多的price
    public void second(List<Item> list) {
        int times = 0;
        
         for(int i=0;i<list.size();i++) {
             int k=0;
             double tem = list.get(i).getPrice();
             for(int j=0;j<list.size();j++) {
                 if( list.get(j).getPrice()== tem) {
                     k++;
                 }
              }      
             System.out.println("k "+k+" tiems "+times);
             if(k>times) {
                 times = k;                  
             }
          }        
            System.out.println("出现最大次数" +times+" " );
    }

  这里在判断list.get(j).getPrice()== tem的时候注意 list.get(j).getPrice()是一个对象,我们的tem是一个数据类型,可以自动拆箱;不能定义为Double对象,不然比较的是内存地址

3.按price去重后的size

//去重使用hashSet
    public void third(List<Item> list) {
        Set set = new HashSet();
        for(int i=0;i<list.size();i++) {
            set.add(list.get(i).getPrice().doubleValue());            
        }
        System.out.println("去重后次数" +set.size());
        
    }

使用HashSet去重,因为是基本数据类型不用,重写hashCode和equals方法 在面试的时候我写成了linkedList这很尴尬,哈哈

找不到工作 ,不怪别人,还是自己的技术不到位,那些劝你面试吹水的人,其实只是站着说话不腰疼,面试不仅是hr面试你,也是你自己面试自己,你要是回答不上来,只能说自己努力不够,技术不到位。加油,继续找工作