还是我比较勤奋一点,效率不是很高,楼主将就一下了int temp = -1; int index = -1; int[] intarray = {-1,2,3,5,-1,1,5,1}; int j = -1; int[] indexarray = new int[intarray.Length]; for (int i = 0;i<intarray.Length; i++) { if (intarray[i] == -1) continue; else{ if (temp == -1) { temp = intarray[i]; continue; } if (temp<intarray[i]) continue; if (temp==intarray[i]) {indexarray[++j] = i;continue;} temp = intarray[i]; index = i; if(j!=-1) { while(j>-1) { indexarray[j] = -1; } } } } Console.Out.WriteLine("{0}",index); for (int i = 0; i<=j;i++) { if (indexarray[i] == -1)break; Console.WriteLine("{0}",indexarray[i]); }对于若数组中有1个以上最小值这样的情况我是用另外一个数组了,不知道其他人还没有更好的办法。
class T { static int MinIdx(int [] a) { int min = int.MaxValue; foreach (int x in a) { if (x != -1 && x <= min) min = x; } int i = 0; foreach (int x in a) { if (x == min) return i; i++; } return -1; } static void Main() { int [] a = {-1,2,3,5,-1,1,5,1}; System.Console.WriteLine(MinIdx(a)); } }
注意, int i = 0; foreach (int x in a) { if (x == min) return i; i++; } 比 for (int i = 0; i < a.Length; i++) { if (a[i] == min) return i; } 效率高,因为前者没有使用a[i],所以在循环中不需要检查数组下标是否会越界。 另,使用 if (x != -1 && x <= min) min = x; 而不是 if (x != -1 && x < min) min = x; 能够在数组全由 int.MaxValue 构成时也能正确工作。
用得着扫描两次?!!int[] arr; int result = -1; int min = int.MaxValue;for ( int i = 0; i < arr.Length; i++ ) { if ( arr[i] == -1 && arr[i] < min ) { min = arr[i]; result = i; } }Console.WriteLine( result );
上面的==应改为!=。想省代码当然可以: for ( int i = 0; i < arr.Length; i++ ) if ( arr[i] != -1 && arr[i] < min ) min = arr[ result = i ];
更正一下, if (x != -1 && x < min) min = x; 也能正确工作,因为 min 的初值就是 int.MaxValue 。
int[] arr; int result = -1; int min = int.MaxValue;for ( int i = 0; i < arr.Length; i++ ) { if ( arr[i] != -1 && arr[i] < min ) { min = arr[i]; result = i; } }Console.WriteLine( result );---------------------------------------int[] arr = { int.MaxValue };会输出 -1,而正确答案是输出 0。如果把 if ( arr[i] != -1 && arr[i] < min ) 改为 if ( arr[i] != -1 && arr[i] <= min ) 则在有两个以上的最小值时,会返回最大索引,而不是最小索引。
Ivony() 说得对,确实只需扫描一趟。要在数组全由 int.MaxValue 组成时能正确工作,又要返回最小索引,只要倒过来扫描即可:class T { static int MinIdx(int [] a) { int min = int.MaxValue; int result = -1; for (int i = a.Length - 1; i >= 0; i--) { if (a[i] != -1 && a[i] <= min) { min = a[result = i]; } } return result; } static void Main() { int [] a = {-1,2,3,5,-1,1,5,1}; System.Console.WriteLine(MinIdx(a)); } }
的确是个伤脑筋的问题for ( int i = 0; i < arr.Length; i++ ) if ( arr[i] != -1 && arr[i] - (i==0?1:0) < min ) min = arr[ result = i ];降低了代码的可读性。
if ( arr[i] != -1 && arr[i] - (i==0?1:0) < min ) 这样不好,在数组的第1个元素是 int.MinValue 时会下溢出的。
倒过来扫描的确是个非常棒的点子,那么这些问题其实都不存在:int[] arr; int min = int.MaxValue; int result;for ( int i = arr.Length; i >= 0; i++ ) if ( arr[i] != -1 && arr[i] <= min ) min = arr[ result = i ];
for ( int i = arr.Length; i >= 0; i++ )应该改为for ( int i = arr.Length - 1; i >= 0; i-- )
if ( arr[i] != -1 && arr[i] - (i==0?1:0) < min ) 这样不好,在数组的第1个元素是 int.MinValue 时会下溢出的。把-改为*即可……反正都不是好点子但写成这样太难看了: for ( int i = 0; i < arr.Length; i++ ) { if ( result == -1 && arr[i] == int.MaxValue ) min = arr[ result = i ]; if ( arr[i] != -1 && arr[i] <= min ) min = arr[ result = i ]; }平白无故多出很多莫名其妙的代码。也非常的晦涩。
for ( int i = 0; i < arr.Length; i++ ) { if ( result == -1 && arr[i] == int.MaxValue ) min = arr[ result = i ]; if ( arr[i] != -1 && arr[i] <= min ) min = arr[ result = i ]; } 如果有多个最小值,这样返回的还是最大索引,还是需要倒过来扫描。
哎……已经被搞昏了……for ( int i = 0; i < arr.Length; i++ ) { if ( result == -1 && arr[i] == int.MaxValue ) min = arr[ result = i ]; if ( arr[i] != -1 && arr[i] < min ) min = arr[ result = i ]; }复制错了代码。
嗯, for ( int i = 0; i < arr.Length; i++ ) { if ( result == -1 && arr[i] == int.MaxValue ) min = arr[ result = i ]; if ( arr[i] != -1 && arr[i] < min ) min = arr[ result = i ]; } 确实能正确工作。不过还是倒过来扫描代码更清晰。
想了一下,上面的正向扫描代码可以改写如下,可读性更好些: for (int i = 0; i < arr.Length; i++) { if (arr[i] != -1 && (result < 0 || arr[i] < min)) { min = arr[result = i]; } }
/* int i = 0; foreach (int x in a) { if (x == min) return i; i++; } 比 for (int i = 0; i < a.Length; i++) { if (a[i] == min) return i; } */ 你这样是算出来了 可是如果有{-1,0,0,0,03,34,5,-1} 的话 只找到的是第一个0的位置 那其他0的位置啊
发错了 class T { static int MinIdx(int [] a) { int min = int.MaxValue; foreach (int x in a) { if (x != -1 && x <= min) min = x; } int i = 0; foreach (int x in a) { if (x == min) return i; i++; } 你这样是算出来了 可是如果有{-1,0,0,0,03,34,5,-1} 的话 只找到的是第一个0的位置 那其他0的位置啊 return -1; } static void Main() { int [] a = {-1,2,3,5,-1,1,5,1}; System.Console.WriteLine(MinIdx(a)); } }
int index = 0; for(int i= 1 ;i< arr.Length ;i++) { if(arr[i] == -1) continue; if(arr[i] < arr[index] ) index = i; }
import java.util.*; public class aaa { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int[] a = {1,-1,-1,3,2,5,8}; Arrays.sort(a); for(int i=0;i<a.length;i++){ System.out.print(a[i]+" "); } for(int i=0;i<a.length;i++){ if(a[i] == -1) continue; else{ System.out.println("最小值不是-1的值是:"+a[i]); break; } } } }
int index = -1;
int[] intarray = {-1,2,3,5,-1,1,5,1}; int j = -1;
int[] indexarray = new int[intarray.Length];
for (int i = 0;i<intarray.Length; i++)
{
if (intarray[i] == -1)
continue; else{
if (temp == -1)
{
temp = intarray[i];
continue;
}
if (temp<intarray[i]) continue;
if (temp==intarray[i]) {indexarray[++j] = i;continue;}
temp = intarray[i];
index = i;
if(j!=-1)
{
while(j>-1)
{
indexarray[j] = -1;
}
}
}
} Console.Out.WriteLine("{0}",index);
for (int i = 0; i<=j;i++)
{
if (indexarray[i] == -1)break;
Console.WriteLine("{0}",indexarray[i]);
}对于若数组中有1个以上最小值这样的情况我是用另外一个数组了,不知道其他人还没有更好的办法。
{
static int MinIdx(int [] a)
{
int min = int.MaxValue;
foreach (int x in a)
{
if (x != -1 && x <= min) min = x;
}
int i = 0;
foreach (int x in a)
{
if (x == min) return i;
i++;
}
return -1;
} static void Main()
{
int [] a = {-1,2,3,5,-1,1,5,1};
System.Console.WriteLine(MinIdx(a));
}
}
int i = 0;
foreach (int x in a)
{
if (x == min) return i;
i++;
}
比
for (int i = 0; i < a.Length; i++)
{
if (a[i] == min) return i;
}
效率高,因为前者没有使用a[i],所以在循环中不需要检查数组下标是否会越界。
另,使用
if (x != -1 && x <= min) min = x;
而不是
if (x != -1 && x < min) min = x;
能够在数组全由 int.MaxValue 构成时也能正确工作。
int result = -1;
int min = int.MaxValue;for ( int i = 0; i < arr.Length; i++ )
{
if ( arr[i] == -1 && arr[i] < min )
{
min = arr[i];
result = i;
}
}Console.WriteLine( result );
for ( int i = 0; i < arr.Length; i++ )
if ( arr[i] != -1 && arr[i] < min )
min = arr[ result = i ];
if (x != -1 && x < min) min = x;
也能正确工作,因为 min 的初值就是 int.MaxValue 。
int result = -1;
int min = int.MaxValue;for ( int i = 0; i < arr.Length; i++ )
{
if ( arr[i] != -1 && arr[i] < min )
{
min = arr[i];
result = i;
}
}Console.WriteLine( result );---------------------------------------int[] arr = { int.MaxValue };会输出 -1,而正确答案是输出 0。如果把
if ( arr[i] != -1 && arr[i] < min )
改为
if ( arr[i] != -1 && arr[i] <= min )
则在有两个以上的最小值时,会返回最大索引,而不是最小索引。
{
static int MinIdx(int [] a)
{
int min = int.MaxValue;
int result = -1;
for (int i = a.Length - 1; i >= 0; i--)
{
if (a[i] != -1 && a[i] <= min)
{
min = a[result = i];
}
}
return result;
} static void Main()
{
int [] a = {-1,2,3,5,-1,1,5,1};
System.Console.WriteLine(MinIdx(a));
}
}
if ( arr[i] != -1 && arr[i] - (i==0?1:0) < min )
min = arr[ result = i ];降低了代码的可读性。
这样不好,在数组的第1个元素是 int.MinValue 时会下溢出的。
int min = int.MaxValue;
int result;for ( int i = arr.Length; i >= 0; i++ )
if ( arr[i] != -1 && arr[i] <= min )
min = arr[ result = i ];
这样不好,在数组的第1个元素是 int.MinValue 时会下溢出的。把-改为*即可……反正都不是好点子但写成这样太难看了:
for ( int i = 0; i < arr.Length; i++ )
{
if ( result == -1 && arr[i] == int.MaxValue )
min = arr[ result = i ];
if ( arr[i] != -1 && arr[i] <= min )
min = arr[ result = i ];
}平白无故多出很多莫名其妙的代码。也非常的晦涩。
{
if ( result == -1 && arr[i] == int.MaxValue )
min = arr[ result = i ];
if ( arr[i] != -1 && arr[i] <= min )
min = arr[ result = i ];
}
如果有多个最小值,这样返回的还是最大索引,还是需要倒过来扫描。
{
if ( result == -1 && arr[i] == int.MaxValue )
min = arr[ result = i ];
if ( arr[i] != -1 && arr[i] < min )
min = arr[ result = i ];
}复制错了代码。
for ( int i = 0; i < arr.Length; i++ )
{
if ( result == -1 && arr[i] == int.MaxValue )
min = arr[ result = i ];
if ( arr[i] != -1 && arr[i] < min )
min = arr[ result = i ];
}
确实能正确工作。不过还是倒过来扫描代码更清晰。
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] != -1 && (result < 0 || arr[i] < min))
{
min = arr[result = i];
}
}
int i = 0;
foreach (int x in a)
{
if (x == min) return i;
i++;
}
比
for (int i = 0; i < a.Length; i++)
{
if (a[i] == min) return i;
}
*/
你这样是算出来了 可是如果有{-1,0,0,0,03,34,5,-1} 的话 只找到的是第一个0的位置 那其他0的位置啊
class T
{
static int MinIdx(int [] a)
{
int min = int.MaxValue;
foreach (int x in a)
{
if (x != -1 && x <= min) min = x;
}
int i = 0;
foreach (int x in a)
{
if (x == min) return i;
i++;
}
你这样是算出来了 可是如果有{-1,0,0,0,03,34,5,-1} 的话 只找到的是第一个0的位置 那其他0的位置啊
return -1;
} static void Main()
{
int [] a = {-1,2,3,5,-1,1,5,1};
System.Console.WriteLine(MinIdx(a));
}
}
for(int i= 1 ;i< arr.Length ;i++)
{
if(arr[i] == -1) continue;
if(arr[i] < arr[index] ) index = i;
}
public class aaa { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = {1,-1,-1,3,2,5,8};
Arrays.sort(a);
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
for(int i=0;i<a.length;i++){
if(a[i] == -1)
continue;
else{
System.out.println("最小值不是-1的值是:"+a[i]);
break;
}
}
}
}