题目来源
牛客网–》华为2016秋招研发笔试题
题目要求
解题(第一次)
思路
代码
package Practice;
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int N = sc.nextInt();
int M = sc.nextInt();
ArrayList<Integer> listGrade = new ArrayList<>();
for (int i = 0; i < N; i++) {
listGrade.add(sc.nextInt());//下标为i,ID是i+1
}
ArrayList<Integer> listMax = new ArrayList<>();
for (int i = 0; i < M; i++) {
String str = sc.next();
char c = str.charAt(0);
int A = sc.nextInt();
int B = sc.nextInt();
if ( c == 'Q' ){
if ( A > B ){
listMax.add(maxMethod(B, A, listGrade));
}else if ( A < B ){
listMax.add(maxMethod(A, B, listGrade));
}else{
listMax.add(listGrade.get(A));
}
}
if( c == 'U'){
listGrade.set( A-1, B);
}
}
for (int i = 0; i < listMax.size(); i++) {
System.out.println(listMax.get(i));
}
}
}
public static Integer maxMethod(int Min, int Max, ArrayList<Integer> listGrade ){
Integer max = 0;
for (int i = Min-1; i <= Max-1; i++){
if (max < listGrade.get(i) ){
max = listGrade.get(i);
}
}
return max;
}
}
注意的地方
- 多组输入,while(sc.hasnext){}必不可少;
- ID从1开始,而数组与集合的下标是从0开始,要记得转换;
- 常用的代码段包装成方法,更简便;
- Scanner里没有直接输入字符的方法,所以要通过这种charAt()的方法输入字符;
String str = sc.next();
char c = str.charAt(0);
犯的错
- ID和下标的问题
- 错误:
listMax.add(listGrade.get(A));
- 正确:
listMax.add(listGrade.get(A-1));
- 错误:
- 马虎把给的A值当成下标给了listMax
- 错误:
listMax.add(A);
- 正确:
listMax.add(listGrade.get(A-1));
- 错误:
后期改进的想法
通过哈希表提高运算速度,同时将成绩一样的人作为值、ID为键进行储存。