论坛首页 招聘求职论坛

今天去面试碰到的两个题,求解

浏览 11279 次
精华帖 (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
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;
			}
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
0 请登录后投票
   发表时间: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]

 

0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2011-03-12   最后修改:2011-03-13
打印在1到N之间且能被M整除的数即可。
对不起,看错了,请无视此贴。
想了一想,可以用队列,先进先出调度。
比如从一开始,数完一后如果不符合情况就又把“一”加到队列末尾,如此循环即可
0 请登录后投票
   发表时间: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)
...
0 请登录后投票
   发表时间: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);
                }
           }
}
0 请登录后投票
   发表时间: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来实现估计就要用链表什么之类复杂的东东了。
这是小弟的处女回贴啊,还请大家多多包涵啊。


兄弟我测试了一下你这个,好像不对呢
0 请登录后投票
   发表时间:2011-03-14  
用循环链表做比较好,特别是数据量达到百万以后,循环链表比上面用数组的快很多。
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics