题解 | #CD5 设计getMin功能的栈#

设计getMin功能的栈

http://www.nowcoder.com/practice/05e57ce2cd8e4a1eae8c3b0a7e9886be

代码一

使用 BufferedReader 读取数据,io 输入时间大幅缩短,

  • 运行时间:1348ms,超过 82.45% 用Java提交的代码
  • 占用内存:21336KB,超过98.89% 用Java提交的代码
import java.util.*;
import java.io.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    Deque<Integer> data = new LinkedList<>();
    Deque<Integer> min = new LinkedList<>();
    public static void main(String[] args) throws IOException {
        Main mn = new Main();
        // 使用 BufferedReader,InputStreamReader 改进读取数据的时间
        BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
        int row = Integer.parseInt(sc.readLine());
        for(int i = 0; i < row; i++) {
            String s = sc.readLine();
            switch(s){
                case "pop":
                    mn.pop();
                    break;
                case "getMin":
                    mn.getMin();
                    break;
                default:
                    String[] ss = s.split(" ");
                    int n = Integer.valueOf(ss[1]);
                    mn.push(n);
                    break;
                    
            }
        }
    }
    
    private void push(int n) {
        data.push(n);
        if(!min.isEmpty()) {
            int curMin = min.peek();
            if (curMin < n){
                min.push(curMin);
            }else {
                min.push(n);
            }
        }else {
            min.push(n);
        }
            
    }
    
    private void getMin() {
        System.out.println(min.peek());
        
    }
    
    private void pop() {
        data.pop();
        min.pop();
    }
        
    
    
}

代码二

使用 Scanner 来读取数据,运行时间长,运行时间:2308ms 占用内存:25668KB

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    Deque<Integer> data = new LinkedList<>();
    Deque<Integer> min = new LinkedList<>();
    public static void main(String[] args) {
        Main mn = new Main();
        Scanner in = new Scanner(System.in);
        in.nextLine();
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String s = in.nextLine();
            switch(s){
                case "pop":
                    mn.pop();
                    break;
                case "getMin":
                    mn.getMin();
                    break;
                default:
                    String[] ss = s.split(" ");
                    int n = Integer.valueOf(ss[1]);
                    mn.push(n);
                    break;
                    
            }
        }
    }
    
    private void push(int n) {
        data.push(n);
        if(!min.isEmpty()) {
            int curMin = min.peek();
            // 每次输入都会保存一份最小数据,这样在跑pop 的时候比较快
            if (curMin < n){
                min.push(curMin);
            }else {
                min.push(n);
            }
        }else {
            min.push(n);
        }
            
    }
    
    private void getMin() {
        System.out.println(min.peek());
        
    }
    
    private void pop() {
        data.pop();
        min.pop();
    }
        
    
    
}
全部评论

相关推荐

点赞 评论 收藏
分享
Natrium_:这时间我以为飞机票
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务