首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
上岸的跳板
2017-08-23 23:02
东南大学 Java
关注
已关注
取消关注
昨晚58同城的编程题关于打印前面比当前值小且下标最大?
有n(n>0)个元素的正整型数组a,打印每个数组元素前面值比他小并且下标最大的元素,如果没有则打印-1,请使用尽可能高效的方法来实现。举例:数组a为[3,6,1,4,2,3,7,5,8], 则打印[-1,3,-1,1,1,2,3,3,5]。大家有没有比O(n2)(
就是遍历数组,再遍历当前数的前面值的方法
)更好的方法啊?
提示
全部评论
推荐
最新
楼层
akalaka
中国科学院大学 C++
从后往前,维持一个递减的单调栈,每次元素出栈,该位置该打印的值也就确定了,时间复杂度O(n)
点赞
回复
分享
发布于 2017-08-23 23:39
上岸的跳板
楼主
东南大学 Java
谢谢各位大神的出谋划策,尤其是
@特仑苏先生
,下面我给出代码: import java.util.Stack; public class BiWoXiaoZuiJin { public static int[] findArray(int[] array) { int[] res = new int[array.length]; Stack<Integer> inc = new Stack<>(); for(int i=0; i<array.length; i++) { while(!inc.isEmpty()) { if(inc.peek() >= array[i]) { inc.pop(); } else { res[i] = inc.peek(); inc.push(array[i]); break; } } if(inc.isEmpty()) { inc.push(array[i]); res[i] = -1; } } return res; } public static void main(String[] args) { int[] arr = {3,6,1,4,2,3,7,5,8}; int[] res = findArray(arr); for(int i=0; i<res.length; i++) { System.out.print(res[i] +" "); } } }
点赞
回复
分享
发布于 2017-08-24 15:17
改个名字解解毒...
西安邮电大学
数组a为[3,6,1,4,2,3,7,5,8], 则打印[-1,3,-1,1,1,2,3,3,5]。单调栈:array = [] array必须从小到大有序保存结果:res = []1.3入栈 array = [3] res[0] = -12.6入栈 array = [3,6] res[1] = 33.1入栈 3,6出栈 array = [1], res[2]= -14.4入栈 array = [1,4], res[3] = 15.2入栈 4出栈 array = [1,2], res[4] = 16.3入栈 array = [1,2,3] res[5] = 27.7入栈 array = [1,2,3,7] res[6] = 38.5入栈 7出栈 array = [1,2,3,5] res[7] = 39.8入栈 array = [1,2,3,5,8] res[8] = 5res = [-1, 3, -1, 1, 1, 2, 3, 3, 5]
点赞
回复
分享
发布于 2017-08-24 10:41
醉阳舞
长安大学 Java
我的思路从后往前遍历,i,j下标,i--,j先标到最后一个。如果值i小于值j,i和j之间的全部设为值j,将i赋给j。如果i等于0时j不等于0,将j处值设为-1,把j赋给i,j--,i--。手机打好麻烦。。。
点赞
回复
分享
发布于 2017-08-24 03:28
*nana*
天津理工大学 Java
import java.util.Scanner; //58题 我考虑在遍历每一个数的时候把前面最小值标记出来,如果现在遍历的数比标记的最小值还是小,那就直接输出-1,这样只有在前面存在比当前数小的情况下才会逆向遍历前面的数 public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int arr[] = new int[n]; int brr[] = new int[n]; for (int i = 0; i < arr.length; i++) { arr[i] = sc.nextInt(); } brr[0] = -1; int min=arr[0]; for (int i = 1; i < arr.length; i++) { if(arr[i]<arr[i-1]){ min=arr[i]; } if(arr[i]<min){ brr[i] = -1; continue; } for (int j = i; j >= 0; j--) { if (arr[i] > arr[j]) { brr[i] = arr[j]; break; } else { brr[i] = -1; } } } for (int i = 0; i < brr.length; i++) { System.out.print(brr[i] + " "); } } }
点赞
回复
分享
发布于 2017-08-24 23:54
LaGuZai
左家垅皇家男子职业技术学院 Java
单调栈,楼上已经说了,左神的算法课也讲了,时间复杂度为O(n)
点赞
回复
分享
发布于 2017-08-24 10:59
你说我很好
武汉大学 Java
用一个栈 O(n)即可解决 找到进栈出栈的规律 自己试一试 左神讲过这个题
点赞
回复
分享
发布于 2017-08-24 08:19
lovesick
浙江大学 C++
单调栈
点赞
回复
分享
发布于 2017-08-24 00:28
牛妹啊
京东集团_软件开发工程师
看看大神
点赞
回复
分享
发布于 2017-08-24 00:20
小王1024
西安财经学院 算法工程师
#include<iostream> #include<vector> #include<iterator> #include<algorithm> using namespace std; void Fun(vector<int> &vec) { int len=vec.size(); for(int i=len-1;i>0;--i) { if(vec[i]>vec[i-1]) { int tmp=vec[i]-vec[i-1]; for(int j=i;j>=0;--j) { int s=vec[i]-vec[j]; if(tmp<s) { tmp=s; } } vec[i]=tmp; } else { vec[i]=-1; } } vec[0]=-1; } int main() { vector<int> vec; int n; cin>>n; for(int i=0;i<n;++i) { int tmp; cin>>tmp; vec.push_back(tmp); } Fun(vec); copy(vec.begin(),vec.end(),ostream_iterator<int>(cout," ")); return 0; }
点赞
回复
分享
发布于 2017-08-23 23:40
darling_mandy
南京大学 Java
设两个游标min和max,分别指向当前位置之前最小和最大的数,然后再判断进行打印
点赞
回复
分享
发布于 2017-08-23 23:26
及时行乐z
桂林电子科技大学 Java
我能想到的就是从后往前遍历,最好的时间复杂度是O(n),最坏的是O(n^2),不太稳定。
点赞
回复
分享
发布于 2017-08-23 23:12
暂无评论,快来抢首评~
相关推荐
01-23 15:35
University of Edinburgh 嵌入式软件工程师
绷不住了,找了一个月实习嵌入式还找不到
2本硕,在这一个下午真的绷不住了,浪费了太多时间,现在的技术栈还停在C语言和stm32上,找嵌入式的实习面试被拷打,找杭州的一个也找不到,真的心里难受,linux没学过,研二了开始慌了。
不知道怎么取名字_:
嵌入式其实不是很好干的,要学的东西比较多的,你这个c stm32都是比较基础的了
点赞
评论
收藏
分享
01-20 10:47
蚌埠坦克学院 嵌入式软件开发
找工作以来我最看不惯就是加班
找工作以来,我最看不惯的不是工作本身,而是加班。不是因为我怕累,而是因为加班往往意味着时间被无形地偷走了。加班会让人失去生活的节奏。原本可以和朋友聚一聚、可以读一本书、可以运动、可以陪家人,但时间被“工作”占据后,生活只剩下重复的工作—睡觉—工作。人开始像机器一样运转,渐渐忘记自己也需要呼吸和放松。更难受的是,加班并不一定代表高效率。很多时候它只是因为计划不清、沟通不畅、任务分配不合理,或者有人习惯性地把工作拖到最后一刻。明明可以用更聪明的方式完成,但却用“加班”来掩盖管理上的问题。我并不是反对努力,而是反对那种把加班当成常态的文化。工作是为了生活,而不是为了被工作吞噬。真正有价值的工作应该是...
找工作以来,你最看不惯_...
点赞
评论
收藏
分享
2025-12-18 11:59
广州南方学院 C++
🤡
路过看一眼不说话都要被踹一脚吗
牛客78682892...:
直接点还好,总比要了简历也不回的强
点赞
评论
收藏
分享
01-20 10:32
OPPO_软件开发部_IT开发工程师(准入职员工)
广州凡岛内推,广州凡岛内推码
测评「卷不卷」灵魂拷问 "弹性打卡+5点半跑路自由"是真的! 但!前提是高效搞定KPI(划重点) 对比广州某些大厂「表演式加班」,凡岛更适合目标感强、想快速成长的狠人 (上周刚见证同组管培生半年升主管,述职PPT那句“广州不相信眼泪,但努力的人永远幸运”直接封神) ▪️ 「萌新生存法则」 1️⃣ 团队95后占70%,开会直接甩脑图互怼,但吵完立马奶茶和好 2️⃣ 公司四餐全包(粤菜湘菜川菜轮流投喂),本湖南人狂喜 3️⃣ 神舟路地铁口10分钟通勤,周边租房2k能拿下带健身房的新公寓 (广州打工人忠告:选离地铁<15分钟的房子!暴雨天就知道多救命) 【日化新锐·广州凡岛】26...
凡岛公司福利 550人发布
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
实习产出怎么包装
2880
2
...
数据库出现慢查询怎么定位?
1625
3
...
29届Java后端
1394
4
...
滴滴lastweek,知无不言
1302
5
...
杭州有赞
946
6
...
第三期「创作模范」名单揭晓!速来围观
876
7
...
学校教的就业咋一点用不上
812
8
...
考研失败春招求助
798
9
...
每天都在被动加班
787
10
...
Java还能入吗
770
创作者周榜
更多
正在热议
更多
#
你的landing期是如何度过的?
#
2998次浏览
50人参与
#
AI时代的工作 VS 传统时代的工作,有哪些不同?
#
2614次浏览
76人参与
#
除了Java,最推荐学什么技术?
#
2174次浏览
60人参与
#
当你问AI“你会取代我的工作吗”,它说_?
#
1071次浏览
38人参与
#
你的第一家实习公司是什么档次?
#
803次浏览
17人参与
#
抛开难度不谈,你最想去哪家公司?
#
710次浏览
23人参与
#
汇川技术求职进展汇总
#
177409次浏览
1055人参与
#
我和mentor的爱恨情仇
#
103024次浏览
928人参与
#
设计人如何选offer
#
186678次浏览
861人参与
#
你在职场上见过哪些“水货”同事
#
30510次浏览
164人参与
#
你觉得什么岗位会被AI替代
#
35332次浏览
236人参与
#
聊聊你的被动加班经历
#
8678次浏览
115人参与
#
你觉得mentor喜欢什么样的实习生
#
45619次浏览
991人参与
#
牛客十周岁生日快乐
#
207969次浏览
1937人参与
#
选offer应该考虑哪些因素
#
139653次浏览
981人参与
#
互联网公司评价
#
480741次浏览
4098人参与
#
秋招想进国企该如何准备
#
123252次浏览
612人参与
#
机械制造面试点评
#
84094次浏览
471人参与
#
你的mentor是什么样的人?
#
49446次浏览
706人参与
#
实习期间如何提升留用概率?
#
231192次浏览
1789人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务