关于数组里第二大数值

Verkkars 2019-05-17 09:46:36
我的想法是首先从小排大排序,然后再倒序遍历小于第一个最大值,那就是第二大数值,这样可不可行?
...全文
1867 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
三仙半 2019-05-25
  • 打赏
  • 举报
回复
引用 12 楼 qq_40674493 的回复:
[quote=引用 11 楼 三仙半 的回复:] 我觉得这个问题没有那么复杂,一趟循环就解决了。

int[] src = new int[] { 34, 568, 141, 568, 2 };
int first;
int sec;
if (src[0] > src[1]) {
	first = src[0];
	sec = src[1];
} else {
	first = src[1];
	sec = src[0];
}
for (int i = 2; i < src.length; i++) {
	if (src[i] > sec) {
		sec = src[i];
		if(src[i]>first) {
			sec = first;
			first=src[i];
		}
	}
}
System.out.println(sec);
前两个元素一样大呢?前三个一样大呢?并且都是最大的呢?[/quote] 你的意思是把相同值去掉?
2019-05-24
  • 打赏
  • 举报
回复
引用 11 楼 三仙半的回复:
我觉得这个问题没有那么复杂,一趟循环就解决了。

int[] src = new int[] { 34, 568, 141, 568, 2 };
int first;
int sec;
if (src[0] > src[1]) {
	first = src[0];
	sec = src[1];
} else {
	first = src[1];
	sec = src[0];
}
for (int i = 2; i < src.length; i++) {
	if (src[i] > sec) {
		sec = src[i];
		if(src[i]>first) {
			sec = first;
			first=src[i];
		}
	}
}
System.out.println(sec);
对。。试试1111111111111
zhiwei.j 2019-05-23
  • 打赏
  • 举报
回复
引用 楼主 Verkkars的回复:
我的想法是首先从小排大排序,然后再倒序遍历小于第一个最大值,那就是第二大数值,这样可不可行?
创建两个中间变量保存最大值和第二大的值,遍历数组和这两个值作比较,满足条件则进行替换
Csdn技术大神 2019-05-23
  • 打赏
  • 举报
回复
可以试一试,方法没毛病
Verkkars 2019-05-23
  • 打赏
  • 举报
回复
引用 47 楼 my_coding_way 的回复:
[quote=引用 楼主 Verkkars的回复:]我的想法是首先从小排大排序,然后再倒序遍历小于第一个最大值,那就是第二大数值,这样可不可行?

创建两个中间变量保存最大值和第二大的值,遍历数组和这两个值作比较,满足条件则进行替换[/quote]
是的,现在搞明白了,这种方法是最快的,感谢指教!
ZhuCheng Xie 2019-05-22
  • 打赏
  • 举报
回复
我的想法是首先从小排大排序,然后再倒序遍历小于第一个最大值,那就是第二大数值,这样可不可行? 或许可以试试用两个变量,遍历的时候用a保存当前最大值,用b保存旧的最大值
chenhaikunak 2019-05-21
  • 打赏
  • 举报
回复
找到最大的数将其踢出数组再进行寻找也行吧。
  • 打赏
  • 举报
回复
sort排序,然后取length-1就是第二大
  • 打赏
  • 举报
回复
冒泡的原理,第一趟是找出最大值吧,如果有两个最大值,直接找出两个但是取的时候,就坑了
坂田银时桑 2019-05-21
  • 打赏
  • 举报
回复
这么简单的问题。。弄两个变量不就好了吗。。
CaptainXue 2019-05-20
  • 打赏
  • 举报
回复
可以,只是当有多个相同数的时,稍微处理一下就可以了
Verkkars 2019-05-20
  • 打赏
  • 举报
回复
引用 12 楼 qq_40674493 的回复:
[quote=引用 11 楼 三仙半 的回复:]
我觉得这个问题没有那么复杂,一趟循环就解决了。

int[] src = new int[] { 34, 568, 141, 568, 2 };
int first;
int sec;
if (src[0] > src[1]) {
first = src[0];
sec = src[1];
} else {
first = src[1];
sec = src[0];
}
for (int i = 2; i < src.length; i++) {
if (src[i] > sec) {
sec = src[i];
if(src[i]>first) {
sec = first;
first=src[i];
}
}
}
System.out.println(sec);
前两个元素一样大呢?前三个一样大呢?并且都是最大的呢?[/quote]
不过如果都是最大值的话,还得多加些条件,确实不是很完美
qq_43625764 2019-05-20
  • 打赏
  • 举报
回复
int s=0; for(int i=0;i<=a.length;i++){ }
maradona1984 2019-05-20
  • 打赏
  • 举报
回复
引用 12 楼 qq_40674493 的回复:
[quote=引用 11 楼 三仙半 的回复:] 我觉得这个问题没有那么复杂,一趟循环就解决了。

int[] src = new int[] { 34, 568, 141, 568, 2 };
int first;
int sec;
if (src[0] > src[1]) {
	first = src[0];
	sec = src[1];
} else {
	first = src[1];
	sec = src[0];
}
for (int i = 2; i < src.length; i++) {
	if (src[i] > sec) {
		sec = src[i];
		if(src[i]>first) {
			sec = first;
			first=src[i];
		}
	}
}
System.out.println(sec);
前两个元素一样大呢?前三个一样大呢?并且都是最大的呢?[/quote] 你的疑问是得出题者自己完善自己的题目的逻辑,而不是由做题者来解决,就好比我数组就一个值怎么办,你题目不把这些异常情况定义好,别人怎么玩?
qq_39936465 2019-05-20
  • 打赏
  • 举报
回复
引用 楼主 yesaid 的回复:
我的想法是首先从小排大排序,然后再倒序遍历小于第一个最大值,那就是第二大数值,这样可不可行?
可以排序去重用heshset ,倒数第2个就是次大值。
Verkkars 2019-05-20
  • 打赏
  • 举报
回复
。。。其实问题的重点不是应该放在优化我的代码上吗?我觉得我写的那段够笨的,很多地方都可以简化很多
Shadowrabbit 2019-05-20
  • 打赏
  • 举报
回复
引用 1 楼 WindyValley的回复:
[quote=引用 楼主 yesaid的回复:]我的想法是首先从小排大排序,然后再倒序遍历小于第一个最大值,那就是第二大数值,这样可不可行?
或许可以试试用两个变量,遍历的时候用a保存当前最大值,用b保存旧的最大值[/quote] 3指针可以做到时间复杂度O(N)搞定,兄弟我觉得你想法正解
空虚沸腾 2019-05-20
  • 打赏
  • 举报
回复
一个入门编程题,不至于这么激烈讨论吧,其实最简单的几种排序里面,加上条件应该问题不大的,多做做acm这种题就会啦
maradona1984 2019-05-20
  • 打赏
  • 举报
回复
引用 28 楼 qq_40674493 的回复:
[quote=引用 26 楼 maradona1984 的回复:] [quote=引用 24 楼 qq_40674493 的回复:] 相同的人全部列出就可以了。问题没说只能有一个吧。哪里矛盾了? 别辩论了,是你钻牛角尖了。自己跟自己过不去。
辩论的前提是不进行人身攻击(这个人身攻击你得自己去百度下是啥,不是你所理解的那个),我讨论问题一直都是就是论事,你一而再再而三做不相关的问题(想多了/想太多/钻牛角尖),这不算钻牛角尖,我说的都是有理有据的,逻辑上是自洽的 你对问题的描述也是前后矛盾的,之前你难道不是说相同的值要舍弃掉么?现在又怎么要留着?这不就说明这题本就可以多种理解吗?[/quote] 哈哈哈哈哈,我无语了。你连我写的舍弃是为什么都没看懂,还和我辩论呢。我投降了,和思维混乱的人辩论是我的错。我认输。哈哈哈哈[/quote] 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。 示例: 输入: nums1 = [1,2,3,0,0,0], m = 3 nums2 = [2,5,6], n = 3 输出: [1,2,2,3,5,6] 随便在leetcode上找的题目,你看人家对题目的定义,足够严谨
maradona1984 2019-05-20
  • 打赏
  • 举报
回复
引用 28 楼 qq_40674493 的回复:
[quote=引用 26 楼 maradona1984 的回复:] [quote=引用 24 楼 qq_40674493 的回复:] 相同的人全部列出就可以了。问题没说只能有一个吧。哪里矛盾了? 别辩论了,是你钻牛角尖了。自己跟自己过不去。
辩论的前提是不进行人身攻击(这个人身攻击你得自己去百度下是啥,不是你所理解的那个),我讨论问题一直都是就是论事,你一而再再而三做不相关的问题(想多了/想太多/钻牛角尖),这不算钻牛角尖,我说的都是有理有据的,逻辑上是自洽的 你对问题的描述也是前后矛盾的,之前你难道不是说相同的值要舍弃掉么?现在又怎么要留着?这不就说明这题本就可以多种理解吗?[/quote] 哈哈哈哈哈,我无语了。你连我写的舍弃是为什么都没看懂,还和我辩论呢。我投降了,和思维混乱的人辩论是我的错。我认输。哈哈哈哈[/quote] 那你说说哪乱了? 按照刚才的理解,你要多个相同的人全部列出,那你的代码又得完善一下,毕竟你只说要循环一下,但他就两个变量,无法支撑这种改动 我只是根据你的结论按照合乎逻辑的推论罢了 顺便总结一下,你一开始说的是写个循环,如果相等就下一个(你应该认吧) 然后又要支持多个,只用循环自然无法支撑,你还得改数据结构 这不就支撑了我的观点,这个题不严谨,不确定的东西太多,难道有问题?
加载更多回复(25)

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧