51,395
社区成员




static ArrayList<Integer> findSwindlers(LinkedList<People> list) {
People[] arr = new People[list.size()];
list.toArray(arr);
while(list.size() > 3) {
People p1 = list.remove();
People p2 = list.remove();
if(!p1.say(p2) && !p2.say(p1)) {
list.add(p1);
}
}
People p1 = list.remove();
People p2 = list.remove();
People honester = p1.say(p2) && p2.say(p1) ? p1 : list.remove();
ArrayList<Integer> resultList = new ArrayList<Integer>();
for(int i = 0;i < arr.length;++i) {
People p = arr[i];
if(honester.say(p)) {
resultList.add(i);
}
}
return resultList;
}
[/quote]
这个算法有问题吧,考虑5个元素: HHHSS的情况,循环结束后,队列里只剩2个元素了[/quote]
确实少考虑了这种情况
如果最后只剩下2个人,必定有一个诚实的人,只要再遍历一次全队列就可以找到。
People p1 = list.remove();
People p2 = list.remove();
People honester = null;
if (list.size() == 3) {
honester = !p1.say(p2) && !p2.say(p1) ? p1 : list.remove();
} else {
int count = 0;
for (People people : arr) {
if(people.say(p1)) ++count;
}
honester = count >= arr.length / 2 ? p2 : p1;
}
static ArrayList<Integer> findSwindlers(LinkedList<People> list) {
People[] arr = new People[list.size()];
list.toArray(arr);
while(list.size() > 3) {
People p1 = list.remove();
People p2 = list.remove();
if(!p1.say(p2) && !p2.say(p1)) {
list.add(p1);
}
}
People p1 = list.remove();
People p2 = list.remove();
People honester = p1.say(p2) && p2.say(p1) ? p1 : list.remove();
ArrayList<Integer> resultList = new ArrayList<Integer>();
for(int i = 0;i < arr.length;++i) {
People p = arr[i];
if(honester.say(p)) {
resultList.add(i);
}
}
return resultList;
}
[/quote]
这个算法有问题吧,考虑5个元素: HHHSS的情况,循环结束后,队列里只剩2个元素了
People honester = null;
if (list.size() == 2) {
People p1 = list.remove();
People p2 = list.remove();
int count = 0;
for (People people : arr) {
if(people.say(p1)) ++count;
}
honester = count >= arr.length / 2 ? p2 : p1;
} else {
honester = list.remove();
}
[/quote]
方法前面也有改动,还是把整个方法贴出来
static ArrayList<Integer> findSwindlers(LinkedList<People> list) {
People[] arr = new People[list.size()];
list.toArray(arr);
while (list.size() > 2) {
People p1 = list.remove();
People p2 = list.remove();
if (!p1.say(p2) && !p2.say(p1)) {
list.add(p1);
}
System.out.println(list);
}
People honester = null;
if (list.size() == 2) {
People p1 = list.remove();
People p2 = list.remove();
int count = 0;
for (People people : arr) {
if(people.say(p1)) ++count;
}
honester = count >= arr.length / 2 ? p2 : p1;
} else {
honester = list.remove();
}
ArrayList<Integer> resultList = new ArrayList<Integer>();
for (int i = 0; i < arr.length; ++i) {
People p = arr[i];
if (honester.say(p)) {
resultList.add(i);
}
}
return resultList;
}
}
People honester = null;
if (list.size() == 2) {
People p1 = list.remove();
People p2 = list.remove();
int count = 0;
for (People people : arr) {
if(people.say(p1)) ++count;
}
honester = count >= arr.length / 2 ? p2 : p1;
} else {
honester = list.remove();
}
package test;
import java.security.SecureRandom;
import java.util.ArrayList;
public class TrustAndLie{
private static SecureRandom sr=new SecureRandom();
public static void main(String...args){
Group unknown=Group.generateSource();
Group lieGroup=findLieGroup(unknown);
unknown.removeAll(lieGroup);
lieGroup.assertLie();
unknown.assertTrust();
System.out.println("I got it, Lie count:"+lieGroup.size()+" Trust count:"+unknown.size());
}
private static Group findLieGroup(Group unknown){
Group sayTrust=new Group();
Group sayLie=new Group();
Group lieGroup=new Group();
while(unknown.size()>0){
People base=unknown.remove(0);
for(People people:unknown)
if(people.test(base)) sayTrust.add(people);
else sayLie.add(people);
if(sayLie.size()==sayTrust.size()) return sayLie;
if(sayTrust.size()>sayLie.size()){
lieGroup.addAll(sayLie);
for(People people:sayTrust)
if(!base.test(people)) lieGroup.add(people);
return lieGroup;
}
lieGroup.add(base);
lieGroup.addAll(sayTrust);
unknown.removeAll(sayTrust);
sayTrust.clear();
sayLie.clear();
}
return lieGroup;
}
private static class Group extends ArrayList<People>{
private static final long serialVersionUID=145658485844788783L;
public static Group generateSource(){
Group group=new Group();
int trust=0;
int lie=0;
for(int i=0;i<1000;i++){
if(sr.nextBoolean()){
group.add(new Trust());
trust++;
}else{
group.add(new Lie());
lie++;
}
}
for(int i=0;i<lie+1-trust;i++)
group.add(new Trust());
return group;
}
public void assertTrust(){
for(People people:this)
people.assertTrust();
}
public void assertLie(){
for(People people:this)
people.assertLie();
}
}
private static class People{
private boolean trust;
public People(boolean trust){
this.trust=trust;
}
public boolean test(People people){
return people.trust;
}
public void assertTrust(){
}
public void assertLie(){
}
}
private static class Trust extends People{
public Trust(){
super(true);
}
@Override
public void assertLie(){
throw new IllegalArgumentException("You're wrong!");
}
}
private static class Lie extends People{
public Lie(){
super(false);
}
@Override
public boolean test(People people){
return sr.nextBoolean();
}
@Override
public void assertTrust(){
throw new IllegalArgumentException("You're wrong!");
}
}
}
if(!p1.say(p2) && !p2.say(p1)) {
list.add(p1);
}
这块代码可能只消除H,不消除S