hash表比arraylist占用空间更小

那些插队的人

http://www.nowcoder.com/questionTerminal/31c1ae9d1c804b66b6ae17181e76f4f0

import java.util.*;
 
 
public class Solution {
    /**
     * 计算有多少个人最终不在自己原来的位置上
     * @param n int整型 队伍总长
     * @param cutIn int整型一维数组 依次会插队到最前方的人的编号
     * @return int整型
     */
    public int countDislocation (int n, int[] cutIn) {
        // write code here
        int maxm = 0;
        int cutnum = cutIn.length;
        int count = 0;
        int index = 1;
        HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
        for(int i=cutIn.length-1;i>=0;i--){
            if(!map.containsKey(cutIn[i])){
                map.put(cutIn[i],index++);
                if(cutnum - i==cutIn[i])
                    count++;
            }
            else
                cutnum--;
            if(cutIn[i]>maxm) //找到最大的数,后面的人位置都不变,前面的没插队的都会变。
                maxm = cutIn[i];
        }
        return maxm-count;
    }
}
这道题的思路是:
①排在最后面的那去插队的人人以后的人,位置肯定都不会变。所以找到maxm,就是最大变化的人数。
②然后去寻找前面的人哪些位置变了:
a、首先在maxm之前的人,没有插队的位置肯定变了。
b、其次,就是去找那些插队的人会不会最后还处在原位。

由于,有些人多次插队,最后一次插队才决定他最后的位置。所以从cutIn数组的后面开始遍历,计算每个人插完队后还有几个人插了队,若插队人数恰好就是该人的原位置,就count++。
用hashmap来记录已经计算过的人,当他重复出现时,不再需要计算(注意,重复的人只算做一个,所以要剪掉cutin队列的长度)

发现hash比arraylist的占用空间小
全部评论

相关推荐

2025-12-27 22:36
门头沟学院 Java
点赞 评论 收藏
分享
明天不下雨了:这个项目 这个简历 这个模板 莫不是一个开源的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务