当前位置: 代码迷 >> J2SE >> 【今天的笔试题】有n个人围成一圈,第s个人开始数,数到第m个人出列,求最后所有人出列的序列
  详细解决方案

【今天的笔试题】有n个人围成一圈,第s个人开始数,数到第m个人出列,求最后所有人出列的序列

热度:140   发布时间:2016-04-24 01:30:52.0
【今天的笔试题求助】有n个人围成一圈,第s个人开始数,数到第m个人出列,求最后所有人出列的序列
今天去了趟北京什么研究所 面试java工程师,给我来了两个算法题,当时就把哥们给制住了,
晚上回来以后充电百度了一下 全是C语言代码解法,我擦,C我不懂啊,有么有大哥用java思路说说算法,给出代码那就更好了

N0.1

加100完全平方数,再加168还是完全平方数,说出算法,

N0.2
N个人围一圈,数到m个人出列,然后继续接着往下数,写出算法和流程图、

------解决方案--------------------
Java code
import java.util.ArrayList;import java.util.List;public class No2 {    int number;    int m;        public static void doTT(int number,int m){        List<Integer> ins = new ArrayList<Integer>();        for(int i =0;i<number;i++){            ins.add(i);        }        int index = 0;//被T的人在列表中下标        for(int i =0;i<number;i++){            //从0开始数数            index = (index+m)%ins.size();            System.out.print(ins.remove(index)+" ");        }    }        public static void main(String args[]){        doTT(10,4);    }}4 9 5 1 8 7 0 3 6 2 //什么环我早忘光了,呵呵。。。
------解决方案--------------------
NO:2参考实例
//filename:love_you.java
public class love_you
{
public static void main(String[] args)
{
final int N=13,S=3,M=5;
int i=S-1,j,k=N,g=1;
int[] a=new int[N];
for(int h=1;h<=N;h++)
a[h-1]=h;
System.out.println("\n出圈顺序为");
do
{
i=i+(M-1);
while(i>=k)
i=i-k;
System.out.print(" "+a[i]);
for(j=i;j<k-1;j++)
a[j]=a[j+1];
k--;
g++;
}while(g<=N);
}
}
------解决方案--------------------
偶是新手,先来抛个砖。
No1.
x+100=a^2,x+100+168=b^2 推出 a^2+168=b^2 即 2*2*2*3*7=(b-a)*(b+a);
针对这个组合编个程,求出可能的a,b ,最后求出x
No2.
ArrayList<Person> Persons=new ArrayList<Person>[N];
int n=0;
while(Persons.size()!=1)
{
if((n+1)%M!=0) continue;
System.out.println(Persons.get(n).getId()+":I'm out.");//Person 类里定义Id属性,getId方法
Persons.remove(n);
n++;
if(n>N-1) n=n-N+1;
}
------解决方案--------------------
Java code
在抛个砖手算就出来了。。。public class pingfangshu {        public static void main(String args[]){        int x = 0;        int y2 = 0;        int y1 = 0;//        x+100==y1*y1;//        x+168 == y2*y2;//        (y2-y1)(y2+y1)== 68;//        (1,68);//        (2,34);//        (4,17);//        (17,4);//        (34,2);//        (68,1);//        68%2=34%2=17;//        y2-y1 = 2;//y2必须为整数,所以其他情况排除  //        y2+y1 = 34;        y2 = 18;y1=16|-16;        x = 96;    }}
------解决方案--------------------
Java code
import java.util.ArrayList;import java.util.LinkedList;public class Test {    public static void main(String[] args) {                getNum(5);    }            public static void getNum(int m){        ArrayList list1 = new ArrayList();//原始数组{0,1,2,3,4}        ArrayList list2 = new ArrayList(); //输出数组                for(int j = 0;j < 5;j++){            list1.add(j);        }                System.out.print("原始数组:");        for(int j = 0;j < list1.size();j++){            System.out.print(list1.get(j) + ",");        }                Object obj = null;        int k = 0;                //while循环原理:如果传进来的参数m小于原始数组list1的长度,就直接移除list1的第m-1个元素,并加入到list2        //如果大于list1的长度,取模得到k,分两种情况,如果等于0,直接得到list1的第0个元素,否则去list1的第k-1个元素,兵加入list2        while(!list1.isEmpty()){            if(m <= list1.size()){                obj = list1.remove(m - 1);                list2.add(obj);            }else{                k = m % list1.size();//取模                if(k != 0){                    obj = list1.remove(k - 1);                    list2.add(obj);                }                    else{                    obj = list1.remove(0);                    list2.add(obj);                }                    }        }                System.out.print("输出数组:");        for(int j = 0;j < list2.size();j++){            System.out.print(list2.get(j) + ",");        }    }}
  相关解决方案