这是我的问题,为此,我制作的节目Java程序占用太多的内存
阿里巴巴做了四十大盗一招,并能够捕获它们 一个大山洞这是内家野狼。盗贼是没有任何武器的 ,只有盗贼的首领有刀。没有 武器,他们将无法与狼战斗,所以他们决定自杀而不是被活着吃掉。
他们都认为他们会站成一个圈,他们每三个人就会自杀,但盗贼队长不喜欢 这个想法,并没有杀死自己的意图。他计算他应该站在哪里,以便他是最后一位。
HackerMan想根据这个故事建立一个游戏,但不是 杀害,他决定参与者将离开游戏,而不是每第三个位置,它将在每个第二个位置。当然 在这场比赛中参加者的人数将远远超过40人。
输入
输入的第一行是一个整数N(1 < = N < = 1000),该 指定的测试用例的数量。之后,每行包含一个 整数X(5 < = X < = 100000000)这是 游戏中的参与者人数。
输出
对于每组数据生成包含 参与者谁生存的位置的线。假设参与者具有序列 号从1到n,并且计数与人1,即开始, 第一人的离去是具有数2.
采样输入
样本输出
3 7月27日
这里是我的解决方案
class SurvivalStrategy {
public int next;
public int value;
public boolean alive;
SurvivalStrategy(int n, int v)
{
this.next = n;
this.value = v;
this.alive = true;
}
public int getNext(){
return this.next;
}
public void kill(){
this.alive = false;
}
public void changeNext(int n){
this.next = n;
}
public static void main(String[] args) throws IOException {
System.out.println("Enter the number of cases");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
int N = Integer.parseInt(line);
int[] array = new int[N];
for(int a = 0; a < N; a++)
{
System.out.println("Enter No. of theives in case " + (a + 1));
array[a] = Integer.parseInt(br.readLine());
}
for(int b = 0; b < N; b++)
{
try{
int theives = 0;
theives = array[b];
SurvivalStrategy[] people = new SurvivalStrategy[theives];
int i = 0;
int nextctr = 2;
for(i = 0; i < people.length; i++)
{
people[i] = new SurvivalStrategy(nextctr, i + 1);
if(nextctr > people.length)
{
people[i] = new SurvivalStrategy(1, i + 1);
}
nextctr++;
}
int k = 0;
int nextguy = 0;
int survivers = people.length;
boolean CarryOnJatta = true;
int lastSurviver = 0;
while(CarryOnJatta)
{
if(k >= people.length)
{
k = 0;
k = k + 2;
}
if(people[k].alive)
{
//System.out.println(people[k].value + " is Alive");
nextguy = people[k].getNext();
if(people[nextguy - 1].alive)
{
people[nextguy - 1].kill();
people[k].changeNext(people[nextguy - 1].next);
lastSurviver = people[k].value;
survivers--;
}else{
k = k + 2;
}
k = k + 2;
}else{
k = k + 2;
}
if (survivers == 1)
{
CarryOnJatta = false;
System.out.println("" + lastSurviver);
}
}
} catch(Exception e)
{
e.printStackTrace();
}
}
}
}
我的程序给出的是小值的输出,但不是大的值。 如果我尝试与输入(23987443)我得到java堆大小超过错误。 有什么办法可以改善这个程序的空间和时间复杂性。 我也打开其他算法,如果他们正在产生所需的输出。
我正在解决一个编码挑战,这是给出的问题,我写了这个完整的代码来解决问题,但我的程序正在占用太多的内存和时间来返回所需的结果 – 2013-02-27 13:09:34
问题听起来类似于[this](http://en.wikipedia.org/wiki/Josephus_problem)。 – Dukeling 2013-02-27 13:16:40
@Dukeling:没错,在那个页面上有一个公式可以立即给出正确的答案。 – Groo 2013-02-27 14:17:33