今天去了趟北京什么研究所 面试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) + ","); } }}