题解 | #栈和排序#

栈和排序

http://www.nowcoder.com/practice/95cb356556cf430f912e7bdf1bc2ec8f

  1. 记录未入栈且未遍历到的元素的最大值(max初始为n)
  2. 从数组中找到max以后将其放入结果集,并将最大数max减1

遍历过程中会出现三种情况:1.max已经在栈中,且为栈顶元素 2.max已经在栈中,且不为栈顶元素 3.max不在栈中 针对情况1:直接将栈顶元素出栈放入结果集 针对情况2:修改最大值,将最大值减1,跳回步骤1 针对情况3:继续遍历,直到找到max 遍历完整个数组后:将栈中元素依次弹出放入结果集。

public int[] solve (int[] a) {
        // write code here
        Stack<Integer> stack = new Stack<>();
        int n = a.length;
        int[] ans = new int[n];
        int k = 0;//记录结果集元素插入的当前下标
        int max = n;//记录剩余待扫描元素的最大值,初始为n
        for(int i = 0; i < n; i++) {
            if(Math.abs(a[i]) == max) {
            //当前元素为剩余元素(包含当前元素)的最大值,则直接加入结果集,并将max修改成下一个待寻找的max值
                ans[k++] = Math.abs(a[i]);
                --max;
            }else if(Math.abs(a[i]) < max){
            //当前元素不是要寻找的那个最大值,则将其入栈并做已入栈标记,即将其值对应下标位置的元素值取反
                stack.push(Math.abs(a[i]));
                a[Math.abs(a[i])-1] *= -1;
            }
            while(true) {
                if(!stack.isEmpty() && stack.peek() == max) {
                //情况1:如果栈顶元素就是要找的最大值,则将其出栈放入结果集,并将max修改成下一个待寻找的max值
                    ans[k++] = stack.pop();
                    --max;
                }else if(max > 0 && a[max-1] < 0){
                //情况2:如果最大值已经入栈,且不是栈顶元素,则直接将max修改成下一个待寻找的max值
                    --max;
                }else{
                //情况3:如果最大值不在栈中或者栈为空或者max=0(即所有元素均遍历),则退出while循环,继续for循环
                    break;
                } 
               //此处之所以用while循环,是因为其中情况1和情况2对max做了修改,需要再一次进行判断
            }
        }
        while(!stack.isEmpty()) {
        //若栈不空,依次将栈中元素弹出放入结果集。
            ans[k++] = stack.pop();
        }
        return ans;
    }
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-10 11:55
点赞 评论 收藏
分享
码农索隆:单休一个月少休息4天,一年就是48天,平时节假日,别人3天假期,单休的两天
点赞 评论 收藏
分享
Twilight_m...:表格简历有点难绷。说说个人看法: 1.个人基本情况里好多无意义信息,什么婚姻状况、健康状况、兴趣爱好、户口所在地、身份证号码、邮政编码,不知道的以为你填什么申请表呢。 2.校内实践个人认为对找工作几乎没帮助,建议换成和测开有关的项目,实在没得写留着也行。 3.工作经历完全看不出来是干什么的,起码看着和计算机没啥关系,建议加强描述,写点你在工作期间的实际产出、解决了什么问题。 4.个人简述大而空,看着像AI生成,感觉问题最大。“Python,C,C++成为我打造高效稳定服务的得力工具”、“我渴望凭借自身技术知识与创新能力,推动人工智能技术的应用发展,助力社会实现智能化转型”有种小学作文的美感。而且你确定你个人简述里写的你都会嘛?你AI这块写的什么“深入研究”,发几篇顶会的硕博生都不一定敢这么写。而且你AI这块的能力和软测也完全无关啊。个人简述建议写你对哪些技术栈、哪些语言、哪些生产工具的掌握,写的有条理些,而且最好是和测开强相关的。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-10 12:05
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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