日期:2014-05-20  浏览次数:20729 次

【今天的笔试题求助】有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) + ",");
        }
    }
}