2016-03-29 4 views
-2

Этот код находит наибольшее число и второе наибольшее число, но дает неправильный номер индекса, но только в некоторых случаях Когда значения массива: {1,3, 3,0,3} Когда значения массива: {3,3,0,1,2}Хотите найти максимальное максимальное число и второе наивысшее максимальное число со своим значением индекса

Если все являются уникальными номерами, то он дает точный ответ с точным значением индекса; Где мне нужно изменить код, чтобы получить точное значение индекса для вышеуказанных случаев?

FirstMaxNumber=arrFindIndex[0]; 
SecondMaxNumber=arrFindIndex[0]; 
FirstMaxRatingIndex=0; 
SecondMaxRatingIndex=0; 

for (int i = 0; i < arrSize; i++) 
{ 
    if (FirstMaxNumber <= arrFindIndex[i]) 
    { 
     SecondMaxNumber = FirstMaxNumber; 
     FirstMaxNumber = arrFindIndex[i]; 
     FirstMaxRatingIndex = i; 
     } 
     else if (SecondMaxNumber <= arrFindIndex[i]) 
     { 
     SecondMaxNumber = arrFindIndex[i]; 
     SecondMaxRatingIndex = i; 
     } 
} 

// print(FirstMaxNumber); 
// Print(FirstMaxRatingIndex); 

// print(SecondMaxNumber); 
// print(SecondMaxRatingIndex); 
+3

Какой язык вы хочет ответ в? Вы отметили 3 разных языка программирования –

+0

asp.net с C# – Sandip

+0

Какой тип переменных? –

ответ

1

В первом случае заявление, значение второго максимального значения устанавливается:

SecondMaxNumber = FirstMaxNumber; 

но индекс не является:

SecondMaxRatingIndex = FirstMaxRatingIndex; 
FirstMaxRatingIndex = i; 
+0

Yaa ... Случаю это, но где я могу получить значение индекса для второго максимального числа – Sandip

+0

Не понимаю, немного меня смущает – Sandip

0

Что-то вроде этого:

FirstMaxNumber = arrFindIndex[0]; 
SecondMaxNumber = arrFindIndex[0]; 

FirstMaxRatingIndex = 0; 
SecondMaxRatingIndex = 0; 

// Do not use magic values: "arrSize" but actual length: arrFindIndex.Length 
for (int i = 1; i < arrFindIndex.Length; i++) { 
    int v = arrFindIndex[i]; 

    if (v > FirstMaxNumber) { 
    // so "first" becomes "second" 
    SecondMaxNumber = FirstMaxNumber; 
    SecondMaxRatingIndex = FirstMaxRatingIndex; 

    FirstMaxNumber = v; 
    FirstMaxRatingIndex = i; 
    } 
    else if ((v > SecondMaxNumber) || (i == 1)) { 
    SecondMaxNumber = v; 
    SecondMaxRatingIndex = i; 
    } 
} 
+0

спасибо, сэр, попробуем это – Sandip

0

Почему бы вам просто не использовать LINQ для этого ?

var arr = new [] {3, 0, 4, 2, 3, 7}; 
var min = arr.Select((Val, Key) => new { Val, Key }).First(x => x.Val == arr.Min()); 
var max = arr.Select((Val, Key) => new { Val, Key }).First(x => x.Val == arr.Max()); 

Console.WriteLine($"Min Key: {min.Key} Val: {min.Val} \nMax Key: {max.Key} Val: {max.Val}"); 

// Output 
// Min Key: 1 Val: 0 
// Max Key: 5 Val: 7 
+0

Мне нужен ручной код для нахождения Максимального числа и Второе наивысшее число с их значением индекса. Мой код может находить наивысшее и второе наивысшее число с его значением индекса, но он дает неправильный ответ для вышеупомянутых случаев. – Sandip

0

Если массивы являются короткими и вы не особенно волнует, как быстро это самый простой код что-то вроде этого:

var indices = Enumerable.Range(0, array.Length).ToArray(); 
Array.Sort(array, indices, Comparer<int>.Create((a, b) => b - a)); 

Тогда indices будет содержать индексы всех элементов, в порядке убывания, так что вам просто нужны первые два.

Вот компилируется приложение консоли (требуется .Net 4.5 или более поздней версии):

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace Demo 
{ 
    static class Program 
    { 
     static void Main() 
     { 
      test(1, 3, 3, 0, 3); // Prints 1, 2 
      test(3, 3, 0, 1, 2); // Prints 0, 1 
     } 

     static void test(params int[] array) 
     { 
      var indices = Enumerable.Range(0, array.Length).ToArray(); 
      Array.Sort(array, indices, Comparer<int>.Create((a,b)=>b-a)); 
      Console.WriteLine($"{indices[0]}, {indices[1]}"); 
     } 
    } 
} 
Смежные вопросы