群硕笔试题

2014-11-24 00:58:21 · 作者: · 浏览: 8

请写一个函数,计算字符串的长度.


答:


int strlen(const char* src){


assert( NULL != src);


int len = 0;


while(*src++ != ‘\0′)


len++;


return len;


}


2. 请写一个函数,实现strstr,即从一个字符串中,查找另一个字符串的位置,如strstr(“12345″, “34″)


返回值为2,在2号位置找到字符串34


答:


char * strstr(const char* src, const char* sub){


assert( NULL != src && NULL != sub);


const char* p = src, *q = sub;


while(*src != ‘\0′){


if(*src++ != *sub++){


src = ++p;


sub = q;


}


}


if(*src == ‘\0′ )


return NULL;


else


return q;


}


3. 编写函数,将”bei jing ni hao ma.”倒置为”ma. hao ni jing bei”,即句子中的单词位置倒置,而不改变单词内部的结构。


答.


void reverse_(char* ptr, int len){


if(len == 0)


return;


char temp;


for(int i =0; i <= len / 2; i++){


temp = *(ptr+i);


*(ptr+i) = *(ptr + len – i);


*(ptr + len -i) = temp;


}


}


void reverse(char * src){


assert(NULL != src);


char * p = src, *src_ = src;


while(*src != ‘\0′){


if(*src == ‘ ‘){


reverse_(p, src-p);


while(*src++ == ‘ ‘);


p = src;


}else{


src++;


}


}


reverse_(src_, src – src_ – 1);


}


4. 智力题,有8个球和一个天平,其中有一个球比其他的都重,看怎么通过2次找到该重球.


答.设球的标签为abcdefgh


先选abc与def比较,三种结果


abc更重,则再比较a与b,如果哪个球重,则该球为重球,如果平衡,则c球为重球


def更重,同上


一样重,则比较g,h,重球为所要之球


5.拓展上面题目,如果有n个球,怎么用最少的次数找到重球,并且求出最少次数。


答.仿照上题即可,次数为大于log3n的最小整数


要写一个Combination


代码如下


import java.util.ArrayList;


import java.util.StringTokenizer;


public class MyCombination {


/**


* @param args


*/


public static void main(String[] args) {


initialize(args);


System.out.println(“Now work”);


doWork(“”);


}


/**


*


* @param args


* initialization


*/


private static void initialize(String[] args) {


if (args.length == 0) {


System.out


.println(“invalid usage\nThe valid usage is \”java MyCombination {set}\”");


}


array = new ArrayList();


StringBuffer sb = new StringBuffer();


for (String i : args) {


sb.append(i + ” “);


}


System.out.println(sb);


StringTokenizer st = new StringTokenizer(new String(sb));


while (st.hasMoreTokens()) {


array.add(st.nextToken());


}


}


/**


*


* @param ab


* main work function


*/


private static void doWork(String ab) {


String[] a = new String[array.size()];


if(ab==”"){


for(int i=0;i

a[i] = new String(“”+array.get(i));


}


for(String i:a){


System.out.println(i);


if(!i.substring(i.length()-1).equals(array.get(array.size()-1))) {


int j = array.indexOf(i.substring(i.length()-1));


for(int k=1;k

String newValue = new String(i+array.get(j+k));


System.out.println(newValue);


doWork(newValue);


}


}


}


}else{


if(!ab.substring(ab.length()-1).equals(array.get(array.size()-1))) {


int j = array.indexOf(ab.substring(ab.length()-1));


for(int k=1;k

String newValue = new String(ab+array.get(j+k));


System.out.println(newValue);


doWork(newValue);


}


}


}


}


private static ArrayList array;


}


就记得几个


1、release和Debug的区别,及其运行速度(如果是.NET下边,呵呵,区别就好说了。如果是VSC++就着实有些话要说了:编译速度、运行速底、调试性等)


2、死锁解缩的四种形式(死锁有四个必要条件,破坏其一即可……)


3、.Net中public/private/proteced/friend/proteced friend的范围(晕死)


4、关于Java的有两道,没怎么注意


5、写函数的题目


1)冒泡法排序


2)关于judge platform的


6、Logic和算法


大意是有一个1001个元素的数组,每个元素都在1到1000这些整数中取值,其中有一个数


值重复了,现在要设计一个算法找出这个数字,且每个元素只能被访问一次。还有其他的


要求,记得不是很清楚了,等回来的同学再补充吧。(加起来就行了)