• 华为2016校园招聘——最高分是多少?


    老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩.

    输入描述:
    输入包括多组测试数据。
    每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M < 5000),分别代表学生的数目和操作的数目。
    学生ID编号从1编到N。
    第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩
    接下来又M行,每一行有一个字符C(只取‘Q’或‘U’),和两个正整数A,B,当C为'Q'的时候, 表示这是一条询问操作,他询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少
    当C为‘U’的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。


    输出描述:
    对于每一次询问操作,在一行里面输出最高成绩.

    输入例子:
    5 7
    1 2 3 4 5
    Q 1 5
    U 3 6
    Q 3 4
    Q 4 5
    U 4 5
    U 2 9
    Q 1 5
    
    
    
    输出例子:
    5
    6
    5
    9



    这道题并不难,思路也挺简单,主要的是在于存储学生成绩以及选择最大的成绩,刚开始我考虑使用Map键值对的形式存储学生的ID以及对应的成绩,有HashMap,TreeMap可以选择,其实选择List也可以存储,但是Map相比List有一个很大好处就是,在更新学生成绩时,Map的put(key,value)方法可以直接覆盖原来对应key的value值,若是使用List,使用add(index,E element)方法后,还需要删除index+1处的元素,因为原来index处的元素会被向下移一位,即需要remove(index+1);List的set(int index,E element)可以实现)

     1 import java.util.ArrayList;
     2 import java.util.Collections;
     3 import java.util.List;
     4 import java.util.Map;
     5 import java.util.Scanner;
     6 import java.util.TreeMap;
     7 
     8 public class MaxScore {
     9 
    10     public static void main(String[] args) {
    11         Map<Integer, Integer> mp = new TreeMap<Integer, Integer>();
    12         Scanner sc = new Scanner(System.in);
    13         while (sc.hasNextLine()) {
    14             String s = sc.nextLine();
    15             String[] st = s.split(" ");
    16             String n = st[0];
    17             String m = st[1];
    18             String score = sc.nextLine();
    19             for (int i = 1; i <= Integer.valueOf(n); i++) {
    20                 String[] st1 = score.split(" ");
    21                 mp.put(i, Integer.valueOf(st1[i - 1]));
    22             }
    23             List<Integer> li = new ArrayList<Integer>();
    24             for (int i = 0; i < Integer.valueOf(m); i++) {
    25                 String s1 = sc.nextLine();
    26                 String[] str = s1.split(" ");
    27                 if (str[0].equals("Q")) {
    28                     int start=0,end=0;
    29                     start = Math.min(Integer.valueOf(str[1]), Integer.valueOf(str[2]));
    30                     end = Math.max(Integer.valueOf(str[1]), Integer.valueOf(str[2]));
    31                     for (int j = start; j <= end; j++) {
    32                         li.add(mp.get(j));
    33                     }
    34                     Collections.sort(li);
    35                     System.out.println(li.get(li.size() - 1));
    36                     li.clear();
    37                 }
    38 
    39                 if (str[0].equals("U")) {
    40                     mp.put(Integer.valueOf(str[1]), Integer.valueOf(str[2]));
    41                 }
    42             }
    43 
    44         }
    45     }
    46 }

    但是上面的写好过于繁琐,复杂度过高,无法AC,尤其是我接收是以一行字符串接受,然后再分割,然后转为Integer,代码比较冗余,于是我改为整数型接收输入:

     1 import java.util.ArrayList;
     2 import java.util.Collections;
     3 import java.util.List;
     4 import java.util.Map;
     5 import java.util.Scanner;
     6 import java.util.TreeMap;
     7 
     8 public class Temp7 {
     9 
    10     public static void main(String[] args) {
    11         Map<Integer, Integer> mp = new TreeMap<Integer, Integer>();
    12         Scanner sc = new Scanner(System.in);
    13         while (sc.hasNext()) {
    14             int n = sc.nextInt();
    15             int m = sc.nextInt();
    16             for (int i = 1; i <= n; i++) {
    17                 mp.put(i, sc.nextInt());
    18             }
    19             List<Integer> li = new ArrayList<Integer>();
    20             for (int i = 0; i < m; i++) {
    21                 String c = sc.next();
    22                 int a = sc.nextInt();
    23                 int b = sc.nextInt();
    24                 if (c.equals("Q")) {
    25                     int start = 0, end = 0;
    26                     start = Math.min(a, b);
    27                     end = Math.max(a, b);
    28                     for (int j = start; j <= end; j++) {
    29                         li.add(mp.get(j));
    30                     }
    31                     Collections.sort(li);
    32                     System.out.println(li.get(li.size() - 1));
    33                     li.clear();
    34                 }
    35                 if (c.equals("U")) {
    36                     mp.put(a, b);
    37                 }
    38             }
    39 
    40         }
    41     }
    42 }

    代码似乎简洁了一些,但是系统还是提示时间超过限制"运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。",复杂度过高,比较郁闷,参考别人代码,发现有人使用数组存储并且在判断大小时循环判断,经过反复试验,确定不是存储问题,而是在判断大小时出现了问题,可能系统认为我这样判断耗时,故该为循环判断解决超时问题;

     1 import java.util.Map;
     2 import java.util.Scanner;
     3 import java.util.TreeMap;
     4 
     5 public class Main {
     6 
     7     public static void main(String[] args) {
     8         Map<Integer, Integer> mp = new TreeMap<Integer, Integer>();
     9         Scanner sc = new Scanner(System.in);
    10         while (sc.hasNext()) {
    11             int n = sc.nextInt();
    12             int m = sc.nextInt();
    13             for (int i = 1; i <= n; i++) {
    14                 mp.put(i, sc.nextInt());
    15             }
    16             //List<Integer> li = new ArrayList<Integer>();
    17             for (int i = 0; i < m; i++) {
    18                 String c = sc.next();
    19                 int a = sc.nextInt();
    20                 int b = sc.nextInt();
    21                 if (c.equals("Q")) {
    22                     int start = 0, end = 0;
    23                     start = Math.min(a, b);
    24                     end = Math.max(a, b);
    25                     int max=mp.get(start);
    26                     for (int j = start; j <= end; j++) {
    27                         //li.add(mp.get(j));
    28                          if(max<mp.get(j)){
    29                                 max = mp.get(j);
    30                             }
    31                          
    32                     }
    33                     System.out.println(max);
    34 //                    Collections.sort(li);
    35 //                    System.out.println(li.get(li.size() - 1));
    36 //                    li.clear();
    37                 }
    38                 if (c.equals("U")) {
    39                     mp.put(a, b);
    40                 }
    41             }
    42 
    43         }
    44     }
    45 }
  • 相关阅读:
    数据库(DB)
    PHP课程设计
    版本号设计规则
    设计模式(Java)
    简单的流式布局(移动应用开发)
    laravel工作机制(PHP程序设计)
    接口自动化测试(软件测试)
    Java学习路线
    ES6基础知识
    promise
  • 原文地址:https://www.cnblogs.com/crazybuddy/p/5343004.html
Copyright © 2020-2023  润新知