优化此代码

Ling_wwl 2010-04-13 01:34:53
怎样优化此代码?
实现的功能:long a[nElems]为空返回-1,否则返回最大值,并删除此值。
目前用了三个FOR语句,怎样优化下?

public long removemax()
{
long b =0;
int i;
if(nElems==0)
return -1;
else {
for (i=0;i<nElems;i++)
if(b<a[i])
b=a[i];
for (i=0;i<nElems;i++)
if (b==a[i])
break;
for (;i<nElems;i++)
a[i]=a[i+1];
nElems--;
return b;
}
}
...全文
116 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
keeya0416 2010-04-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 libitum_1 的回复:]
引用 4 楼 keeya0416 的回复:
Java code

public static int removeMax(int[] values) {
if (values.length <= 0) {
return -1;
} else {
int temp = 0;
for (int i = 0; i < values……


请问4楼,^=是啥意思啊?能说说吗?都没用……
[/Quote]
a ^= b;
就是 a = a ^ b;
是异或的意思 按位对比2数 相同为0,不同为1;
libitum_1 2010-04-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 keeya0416 的回复:]
Java code

public static int removeMax(int[] values) {
if (values.length <= 0) {
return -1;
} else {
int temp = 0;
for (int i = 0; i < values……
[/Quote]

请问4楼,^=是啥意思啊?能说说吗?都没用过。
ZangXT 2010-04-13
  • 打赏
  • 举报
回复
不先判断是不是null吗
James.Ji 2010-04-13
  • 打赏
  • 举报
回复
public static void main(String[] args) {
String number = "000000";
String id = "310141597210452232";
String all = id + number;
byte[] messages = all.getBytes();
for (int i = 0; i < messages.length; i++) {
System.out.println(messages[i]);
}
byte[][] strArray = new byte[3][messages.length / 3];
if (messages.length % 3 == 0) {
for (int i = 0; i < 3; i++) {
strArray[i] = new String(messages, i * messages.length / 3, 8)
.getBytes();
}
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 8; j++) {
System.out.print(strArray[i][j]);
}
System.out.println();
}
}
Ling_wwl 2010-04-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 keeya0416 的回复:]
Java code

public static int removeMax(int[] values) {
if (values.length <= 0) {
return -1;
} else {
int temp = 0;
for (int i = 0; i < values……
[/Quote]


这个方法很不错,值借鉴!对无序数组很有用。
但如果是有序数组可能还是要用FOR了。。。。
niulin 2010-04-13
  • 打赏
  • 举报
回复
好像没有了吧,第一个for是必须的,找出最大值及其下标,第2个用于移动。
这是数组中的元素删除,又不是链表之类的,删除一个元素必须for一次
zoeg 2010-04-13
  • 打赏
  • 举报
回复
"并删除此值"?
这个无解,数组的长度是变不了的,除非你搞一个新的数组重新装一遍;
抛开鸡蛋里的骨头的话:
扫描一次数组,用两个变量记录碰到的最大值以及碰到最大值的时候的锚点
扫描结束后,拿这两个变量的信息就可以抓到关于最大值的描述了,再作进一步处理;
但是如果允许最大值出现多个,那么你对锚点的记录要换成集合!
keeya0416 2010-04-13
  • 打赏
  • 举报
回复

public static int removeMax(int[] values) {
if (values.length <= 0) {
return -1;
} else {
int temp = 0;
for (int i = 0; i < values.length; i++) {
if (values[temp] < values[i]) {
temp = i;
}
}
// 下边把最大值和数组最后一个值换掉。
values[temp] ^= values[values.length - 1];
values[values.length - 1] ^= values[temp];
values[temp] ^= values[values.length - 1];

return values[values.length - 1];
}

}

LZ 只能把最大值给换数组最后边了
JAVA里没有返回2个值的机制,也没法引用传递
可以再再外边处理那最个最大的值,因为已经知道在数组最后了
Ling_wwl 2010-04-13
  • 打赏
  • 举报
回复
谢谢!当时就在找怎样标记数组下标,没想出来,呵呵,刚学!

现在已经缩了一个FOR,还有没有更好的方法?

public long removemax()
{
long b =a[0];
int i,c=0;
if(nElems==0)
return -1;
else {
for (i=0;i<nElems;i++)
{if(b<a[i])
{b=a[i];
c=i;}
}
for (;c<nElems;c++)
a[c]=a[c+1];
nElems--;
return b;
}
}
LuffySY 2010-04-13
  • 打赏
  • 举报
回复

public int removemax(int[] array)
{
if(array.length<=0)
{
return -1;
}
else
{
int max=array[0];
int temp=0;
for(int i=1;i<array.length;i++)
{
if(max<array[i])
{
max=array[i];
temp=i;
}
}
//在这里根据temp 往前移位,移位注意数组最后一个数字,尤其最大值是最后一个
return max;
}

}
LuffySY 2010-04-13
  • 打赏
  • 举报
回复
第一次遍历用冒泡把最大的值 取出来 记下 这个值的数组下标。
将最大值 直接返回。删除的话从下标开始 都往前移一位。

62,614

社区成员

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

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