锁定老帖子 主题:今天去面试碰到的两个题,求解
精华帖 (0) :: 良好帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-03-12
第1题的话:主要是^和&的计算问题了
7^3 就是把7转成二进制:111 把3转成二进制:011 ^代表或者的关系,即100,所以7^3=4 7&6 就是把7转成二进制:111 把6转成二进制:110 &代表并且的关系,即110,所以7&6=6 |
|
返回顶楼 | |
发表时间:2011-03-12
qianshuiqs 写道 小弟以前在大学里考三级C时遇到过这个问题,那次考前准备看了100多个编程题,就这题不会做,当时也没有仔细钻研。现在工作一年了,又遇到这个问题,这次决定认真做一下。做完之后发现以为非常复杂的问题却可以用很简单的代码解决,看来还是进步了一点点,呵呵,上代码:
public class tttt { public static void main(String args[]){ new tttt().aa(10, 3); } public void aa(int n,int m){ List a1=new ArrayList(); List a2=new ArrayList(); for(int i=0;i<n;i++){ a1.add(i+1); } int index=0; while(a1.size()>0){ index+=(m-1); a2.add(a1.remove(index%a1.size())); } for(int j=0;j<a2.size();j++){ System.out.print(a2.get(j)+" "); } } } 用java语言实现这个非常简单,但如果用C来实现估计就要用链表什么之类复杂的东东了。 这是小弟的处女回贴啊,还请大家多多包涵啊。 我也写了个,列出详细过程了: List<Integer> list=new LinkedList<Integer>(); for(int i=1;i<=n;i++) list.add(i); System.out.println(list); System.out.println("开始报数,"); System.out.println("报到"+m+"号就出列,"); int index=1; int i=0; while(list.size()>0){ System.out.println(list.get(i)+"号报数为:"+index); if(index==m){ System.out.println(list.get(i)+"号出列!"); list.remove(list.get(i)); index=1; if(i==list.size()){ i=0; } continue; } index++; i++; if(i==list.size()){ i=0; } |
|
返回顶楼 | |
发表时间:2011-03-12
神之小丑 写道 qianshuiqs 写道 小弟以前在大学里考三级C时遇到过这个问题,那次考前准备看了100多个编程题,就这题不会做,当时也没有仔细钻研。现在工作一年了,又遇到这个问题,这次决定认真做一下。做完之后发现以为非常复杂的问题却可以用很简单的代码解决,看来还是进步了一点点,呵呵,上代码:
public class tttt { public static void main(String args[]){ new tttt().aa(10, 3); } public void aa(int n,int m){ List a1=new ArrayList(); List a2=new ArrayList(); for(int i=0;i<n;i++){ a1.add(i+1); } int index=0; while(a1.size()>0){ index+=(m-1); a2.add(a1.remove(index%a1.size())); } for(int j=0;j<a2.size();j++){ System.out.print(a2.get(j)+" "); } } } 用java语言实现这个非常简单,但如果用C来实现估计就要用链表什么之类复杂的东东了。 这是小弟的处女回贴啊,还请大家多多包涵啊。 我也写了个,列出详细过程了: List<Integer> list=new LinkedList<Integer>(); for(int i=1;i<=n;i++) list.add(i); System.out.println(list); System.out.println("开始报数,"); System.out.println("报到"+m+"号就出列,"); int index=1; int i=0; while(list.size()>0){ System.out.println(list.get(i)+"号报数为:"+index); if(index==m){ System.out.println(list.get(i)+"号出列!"); list.remove(list.get(i)); index=1; if(i==list.size()){ i=0; } continue; } index++; i++; if(i==list.size()){ i=0; } 这个不错,学习ing |
|
返回顶楼 | |
发表时间:2011-03-12
第一题没看懂说什么。 public class SaturdayNight { public static void main(String args[]) { final int m = 3; final int n = 20; List<Integer> list = new LinkedList<Integer>();// 链表存放未出列的所有数字 Vector<Integer> resultVector = new Vector<Integer>();// 存放最终排列的序列 for (int i=1; i<=n; i++) { list.add(i); /*初始化为1, 2, 3, ..., n-1, n */ } int nStartIndex = 0; // 当前报1号的list中的下标 int nCalcIndex = 0; // 计算出需要出来的list中的下标 int nListSize = n; while (nListSize > 0) { nCalcIndex = (nStartIndex + m-1)%nListSize; resultVector.add(list.remove(nCalcIndex)); nListSize = list.size(); nStartIndex = nCalcIndex; } System.out.println("当 m= "+ m + ", n= " + n +"时,序列为: " + resultVector.toString()); } } 当 m= 6, n= 4时,序列为: [2, 1, 4, 3] 当 m= 16, n= 7时,序列为: [2, 6, 7, 5, 1, 4, 3] 当 m= 3, n= 20时,序列为: [3, 6, 9, 12, 15, 18, 1, 5, 10, 14, 19, 4, 11, 17, 7, 16, 8, 2, 13, 20]
|
|
返回顶楼 | |
发表时间:2011-03-12
用链表的方式来做:
package org.joseff.test; public class Link { private int value; private Link next; private Link previous; public Link getPrevious() { return previous; } public void setPrevious(Link previous) { this.previous = previous; } public Link(int value){ this.value = value; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } public Link getNext() { return next; } public void setNext(Link next) { this.next = next; } public Link remove(){ System.out.println(this.getValue()); Link p = this.getPrevious(); Link n = this.getNext(); p.setNext(n); n.setPrevious(p); return n; } } package org.joseff.test; public class Test { public static void main(String[] args) { //initialize the link nodes. Link t1 = new Link(1); Link first = t1; for(int i = 2 ; i <= 20 ; i++ ){ Link link = new Link(i); t1.setNext(link); link.setPrevious(t1); t1 = link; } t1.setNext(first); first.setPrevious(t1); print(first); } public static void print(Link link){ //left the last node if(link.getNext() == link){ System.out.println(link.getValue() + " "); return; } Link tmp = link; for(int i = 1 ; i < 3 ; i++ ){ tmp = tmp.getNext(); } Link n = tmp.remove(); print(n); } } 结果:3 、6 、9 、12 、15 、18 、1 、5 、10 、14 、19 、4 、11 、17 、7 、16 、8 、2 、13 、20 |
|
返回顶楼 | |
发表时间:2011-03-12
最后修改:2011-03-13
打印在1到N之间且能被M整除的数即可。
对不起,看错了,请无视此贴。 想了一想,可以用队列,先进先出调度。 比如从一开始,数完一后如果不符合情况就又把“一”加到队列末尾,如此循环即可 |
|
返回顶楼 | |
发表时间:2011-03-14
最后修改:2011-03-14
M=20
N=3 for i in range(1,M+1): j=i%N if 0==j: print (i,N) else: print (i,j) (1, 1) (2, 2) (3, 3) (4, 1) (5, 2) (6, 3) (7, 1) (8, 2) (9, 3) ... |
|
返回顶楼 | |
发表时间:2011-03-14
第二题:
public void printInt(int M,int N) { for(int i=1;i<=N;i++) { if(N%M==0){ System.out.print(N); } } } |
|
返回顶楼 | |
发表时间:2011-03-14
qianshuiqs 写道 小弟以前在大学里考三级C时遇到过这个问题,那次考前准备看了100多个编程题,就这题不会做,当时也没有仔细钻研。现在工作一年了,又遇到这个问题,这次决定认真做一下。做完之后发现以为非常复杂的问题却可以用很简单的代码解决,看来还是进步了一点点,呵呵,上代码:
public class tttt { public static void main(String args[]){ new tttt().aa(10, 3); } public void aa(int n,int m){ List a1=new ArrayList(); List a2=new ArrayList(); for(int i=0;i<n;i++){ a1.add(i+1); } int index=0; while(a1.size()>0){ index+=(m-1); a2.add(a1.remove(index%a1.size())); } for(int j=0;j<a2.size();j++){ System.out.print(a2.get(j)+" "); } } } 用java语言实现这个非常简单,但如果用C来实现估计就要用链表什么之类复杂的东东了。 这是小弟的处女回贴啊,还请大家多多包涵啊。 兄弟我测试了一下你这个,好像不对呢 |
|
返回顶楼 | |
发表时间:2011-03-14
用循环链表做比较好,特别是数据量达到百万以后,循环链表比上面用数组的快很多。
|
|
返回顶楼 | |