Не правильно работает поиск отличий элементов в массиве
Дан массив целых чисел нечетной длины, в котором все числа одинаковы, за исключением одного числа. Мне нужно создать метод который возвращает цифру которая отличается от большинства элементов массива. У меня есть метод который принимает такой массив. К примеру, я передаю такой массив [1,1,2,1,1] . И я получаю ожидаемый результат в виде двойки. Но когда я двойку ставлю первым элементом [2,1,1,1,1], результат уже единица. Помогите решить проблему.
Вот мой метод:
public static int Stray(int[] numbers)
{
int temp;
for (int i=0; i < numbers.Length; i++){
for (int j = i + 1; j < numbers.Length; j++){
if (numbers[i] != numbers[j]){
temp = numbers[j];
Console.WriteLine(temp);
return temp;
}
}
}
return 0;
}
Ответы (3 шт):
int temp = 0;
for (int i=0; i < numbers.Length; i++)
temp ^= numbers[i];
return temp;
Сколько раз повторится внешний цикл? Только один. Внутренний цикл обязательно найдёт пару не равных элементов и завершит работу.
Программа свелась к сравнению первого элемента со всеми остальными. И если первый элемент не равен элементу j, будет выдан элемент j. А первый элемент вы не возвращаете никогда.
Если отличающийся элемент на первом месте, программа ошибается.
Так как известно, что длина массива нечётная, значит он содержит как минимум 1 элемент, поэтому цикл можно начинать с 1 и проверять сразу 2 следующих элемента:
public static int Stray(int[] arr) {
int num = arr[0];
for (int i = 1; i < arr.Length; i += 2) {
if (num != arr[i]) {
if (arr[i] != arr[i + 1]) {
return arr[i];
} else {
return num;
}
} else if (num != arr[i + 1]) {
return arr[i + 1];
}
}
return num;
}