如有一组数组:-1,2,3,5,-1,1,5,1我想取得最小的且不等于-1的数的索引值。怎么取得呢?(上面的就等于5,有相等的最小值取第一个的索引值)

解决方案 »

  1.   

    还是我比较勤奋一点,效率不是很高,楼主将就一下了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个以上最小值这样的情况我是用另外一个数组了,不知道其他人还没有更好的办法。
      

  2.   

    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));
      }
    }
      

  3.   

    注意,
        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 构成时也能正确工作。
      

  4.   

    用得着扫描两次?!!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 );
      

  5.   

    上面的==应改为!=。想省代码当然可以:
    for ( int i = 0; i < arr.Length; i++ )
      if ( arr[i] != -1 && arr[i] < min )
        min = arr[ result = i ];
      

  6.   

    更正一下,
          if (x != -1 && x < min) min = x;
    也能正确工作,因为 min 的初值就是 int.MaxValue 。
      

  7.   

    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 )
    则在有两个以上的最小值时,会返回最大索引,而不是最小索引。
      

  8.   

    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));
      }
    }
      

  9.   

    的确是个伤脑筋的问题for ( int i = 0; i < arr.Length; i++ )
      if ( arr[i] != -1 && arr[i] - (i==0?1:0) < min )
        min = arr[ result = i ];降低了代码的可读性。
      

  10.   

    if ( arr[i] != -1 && arr[i] - (i==0?1:0) < min )
    这样不好,在数组的第1个元素是 int.MinValue 时会下溢出的。
      

  11.   

    倒过来扫描的确是个非常棒的点子,那么这些问题其实都不存在: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 ];
      

  12.   

    for ( int i = arr.Length; i >= 0; i++ )应该改为for ( int i = arr.Length - 1; i >= 0; i-- )
      

  13.   

    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 ];
    }平白无故多出很多莫名其妙的代码。也非常的晦涩。
      

  14.   

    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 ];
    }
    如果有多个最小值,这样返回的还是最大索引,还是需要倒过来扫描。
      

  15.   

    哎……已经被搞昏了……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 ];
    }复制错了代码。
      

  16.   

    嗯,
    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 ];
    }
    确实能正确工作。不过还是倒过来扫描代码更清晰。
      

  17.   

    想了一下,上面的正向扫描代码可以改写如下,可读性更好些:
    for (int i = 0; i < arr.Length; i++)
    {
      if (arr[i] != -1 && (result < 0 || arr[i] < min))
      {
        min = arr[result = i];
      }
    }
      

  18.   

    Ivony() 的代码可以,当然要是对代码比较熟悉的了。初学的可能没有那么容易理解哦。还是加些括号比较好。
      

  19.   

    /*
    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的位置啊  
      

  20.   

    发错了
    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));
      }
    }
      

  21.   

    int index = 0;
    for(int i= 1 ;i< arr.Length ;i++)
    {
       if(arr[i] == -1) continue;
       if(arr[i] < arr[index] ) index = i;
    }
      

  22.   

    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;
    }
    }
    }
    }