2017-03-21 67 views
0

的每一个最大数我有3种int类型:最有效的方法来查找一组数字

int value1; 
int value2; 
int value3; 

而3布尔值:

bool maxIs1; 
bool maxIs2; 
bool maxIs3; 

的输入值必须是独立的变量。

maxIs1 = True表示value1必须具有最大值等。

我需要方法来比较这组数字与一组条件。 例如:

int value1 = 10; 
int value2 = 1; 
int value3 = 10; 

bool maxIs1 = True; 
bool maxIs2 = False; 
bool maxIs3 = True; 

bool result = compareValues(); //true 

或者:

int value1 = 1; 
int value2 = 1; 
int value3 = 10; 

bool maxIs1 = True; 
bool maxIs2 = False; 
bool maxIs3 = True; 

bool result = compareValues(); //false 

什么是最有效的方式来做到这一点?

+0

是变量不变(3)或有可能是其他变量的量? –

+0

在我的情况下,这里只有3. – InfernumDeus

+0

如果你担心效率和超过3个值,这是一个'O(n)'问题,你只需要迭代一次输入。 – Rawling

回答

1

我不认为你不必在意效率在3个值

int value1 = 10; 
int value2 = 1; 
int value3 = 1; 

bool maxIs1 = true; 
bool maxIs2 = false; 
bool maxIs3 = true; 

int max = new[] { value1, value2, value3 }.Max(); 
bool result = (!maxIs1 || value1 == max) && (!maxIs2 || value2 == max) && (!maxIs3 || value3 == max); 
0

的情况下,如果你想不同数量的值尝试这种解决方案:

static void Main() 
    { 
     List<int> listOfInts = new List<int>(); 
     List<bool> listOfBools = new List<bool>(); 

     listOfInts.Add(1); 
     listOfInts.Add(2); 
     listOfInts.Add(1); 

     listOfBools.Add(false); 
     listOfBools.Add(false); 
     listOfBools.Add(false); 

     Console.WriteLine("value = " + Compare(listOfInts,listOfBools)); 

    } 

Compare()应该像这个:

static bool Compare(List<int> listOfInts, List<bool> listOfBools) 
    { 
     int max = listOfInts.Max(); 
     bool isCorrect = true; 

     var maxList = listOfInts.Where(value => value == max); 
     var indicesOfMax = GetIndeciesOfMax(maxList, listOfInts); 

     for (int i = 0; i < listOfInts.Count; i++) 
     { 
      if (indicesOfMax.Contains(i) && listOfInts[i] == max && listOfBools[i]) 
      { 
       isCorrect = true; 
      } 
      else if (!indicesOfMax.Contains(i) && listOfInts[i] != max && !listOfBools[i]) 
      { 
       isCorrect = true; 
      } 
      else 
      { 
       isCorrect = false; 
       break; 
      } 
     } 

     return isCorrect; 
    } 

    static List<int> GetIndeciesOfMax(IEnumerable<int> maxList, List<int> list) 
    { 
     List<int> indecies = new List<int>(); 

     foreach (var m in maxList) 
     { 
      indecies.Add(list.IndexOf(m)); 
     } 

     return indecies; 
    } 
+2

你真的做了一个简单的任务复杂.... – caesay

+0

我认为你是对的,为你的简单答案+1 –

2

这很有趣。如果你可以把它们放到一个数组,你可以使用LINQ干净检查它们是否都满足条件:

var values = new[] { value1, value2, value3 }; 
var maxes = new[] { maxIs1, maxIs2, maxIs3 }; 
var max = values.Max(); 

var result = values 
    .Zip(maxes, (f, s) => new { value = f, isMax = s }) 
    .All(c => !c.isMax || (c.value == max)); 
+0

如果价值是最大的但你的答案满足条件,但布尔价值说,它不是,我想在这它应该返回false –

+1

@AliEzzatOdeh:如果这是你想要的行为,你可以将最后一行改为'.All(c =>(!c.isMax && c.value!= max)||(c.isMax && c。 value == max));' – caesay

相关问题