您的位置:首页 > 其它

主元素问题

2016-01-25 16:08 288 查看
前提是主元素一定存在

/**
* 核心思想:在元素数组中,删去不同的两个元素,数组的主元素保持不变。
*/
public class MainElement {

public static void main(String[] args) {
int[] numbers = {1, 2, 1, 2, 2, 2, 3};

int mainElement = findMainElement(numbers);
System.out.println(mainElement);
}

private static int findMainElement(int[] numbers) {
int len = numbers.length;
if (len == 0) {
return 0;
}
if (len == 1) {
return numbers[0];
}

// 刚开始的时候,假设第0个元素是主元素,那么此时有1个主元素
int count = 1;
int mainFrom = 0;
int start = numbers[mainFrom];

// 第0个元素已经由假设的主元素占据,那么将从第1个元素开始比较
for (int i = 1; i < len;) {
if (start == numbers[i]) {
// 如果当前元素与假设的主元素相同,计数+1
count++;
} else {
// 如果当前元素与假设的主元素不同,计数-1
count--;
}

if (count == 0) {
// 扔掉了偶数个(2、4、6...)不同的元素,需要将计数置为1,此时假设下一个元素为主元素,则指针需要指向下下个(你没有看错,确实是“下下个”)元素
count = 1;
mainFrom = i+1;
start = numbers[mainFrom];
i += 2;
continue;
}

if (count > (len-mainFrom)/2) {
// 这时候人品爆发,捡到的元素个数已经大于(从mainFrom到len-1的元素个数【包含mainFrom和len-1】)/2,可以确定该元素就是我们要找的
return numbers[mainFrom];
}

i++;
}
return start;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: