去哪儿网2015春季校招笔试--回忆版
第一次做笔试题,好激动。今年研发类的有三道题目,干净利落,比较喜欢去哪儿的题目类型,晚上回去做腾讯的在线笔试就比较坑了,各种多选与程序天空,各种C++语法。。。无力吐槽,C++学的太菜了。奋斗了一个半小时做出了两题,感觉也还行,谁知今天在电脑上跑一跑,两道都有问题!不管怎么说,大体思路是对的。下面把这几道题贴出来,希望对大家有一定的借鉴作用,欢迎拍砖。
第一题:public static int binarySort(int arr[],int target)
描述:
找数组中的关键字,int indexOf(int array[],int key),数组是升序排列的整数右移n位的结果。如:源数组是[1,2,4,5,7,9,10,11],移位后的结果是[9,10,11,1,2,4,5,7],找到返回该关键字的下标没找到返回-1。
思路:
变了形的二分查找,多加两个判定条件判定在target大于中间值和结束位置的值&&target小于开始位置的值和中间位置的值时,由于该数组是移位过后的有序数组,所以,target可能在另外一半,bravo!
代码:
- public static int binarySort(int arr[],int target)
- {
- int start=0,end=arr.length-1;
- int mid=0;
- while(start<=end)
- {
- mid=(start+end)/2;
- if(arr[mid]==target)
- return mid;
- if(target>arr[mid]&&target>arr[end])
- end=mid-1;
- else if(target<arr[mid]&&target<arr[start])
- start=mid+1;
- else if(target>=arr[start]&&target<arr[mid])
- end=mid-1;
- else if(target<=arr[end]&&target>arr[mid])
- start=mid+1;
- }
- return -1;
- }
第二题:public static String decode(String str)
描述:
给字符解密,解密的规则如下,a2bc3c5e6,解密之后的结果是:aabcbcbcccceeeeee,其中整数的值不超过整型的最大值
思路:
就是循环先判断字符串str,再判断数字num,然后循环num次将字符串append到strBuiler上,竟让没有注意到整数最大值不超过整型最大值,它是可以多位数的。。。。。
代码:
- public static String decode(String str)
- {
- StringBuilder sBuilder =new StringBuilder();
- StringBuilder sbTemp=new StringBuilder();
- String strTemp=null;
- int num=0;
- int len=str.length();
- char ch;
- for(int i=0;i<len;i++)
- {
- while(true)
- {
- ch=str.charAt(i);
- if((ch>'9'||ch<'0')&&i<len)
- {
- sbTemp.append(ch);
- i++;
- }else if(i<len)//修改前只考虑了个位数,题目要求数字是不超过整型的最大值。
- {
- while(ch>='0'&&ch<='9')
- {
- num=num*10+ch-'0';
- i++;
- if(i<len)
- ch=str.charAt(i);
- else
- break;
- }
- if((ch>'9'||ch<'0'))
- i--;
- break;
- }
- }
- strTemp=sbTemp.toString();
- for(int j=0;j<num;j++)
- sBuilder.append(strTemp);
- num=0;
- sbTemp.delete(0, sbTemp.length());
- }
- return sBuilder.toString();
- }
第三题:public static List<List<Integer>>rangePrices(int arr[][])
描述:
数据的格式[start day,end day,price]
[1,30,250],[20,60,200]->[1,19,250],[20,60,200]
[1,100,250],[20,40,200]->[1,19,250],[20,40,200],[41,100,250]
[1,100,250],[20,40,250]->[1,100,250]
[1,30,250],[20,60,250]->[[1,60,250]
如上面的数据所示,本题要实现的功能就是将二维数组里面的其实天数和价格进行合并,合并的规则是,将重合的部分取价格的最小值
思路:
我感觉这题对一个人的思考能力有一个很大的考验,如何考虑到可能出现的各种条件是解决本题的关键,难倒不是太难,两个小时肯定可以写出来,问题时,笔试的时候世间又紧,压力又大,这是由不得人的。所以啊,革命尚未未成功,仍需要加倍努力啊!
另:题目要求的是返回二维数组,由于对java的二维数组用的不是很多,改为返回容器了。还有本题的参考代码有可能很不严谨,欢迎拍砖
代码:
- public class RangePrices
- {
- public static List<List<Integer>>rangePrices(int arr[][])
- {
- int start1=arr[0][0],end1=arr[0][1],num1=arr[0][2];
- int start2=arr[1][0],end2=arr[1][1],num2=arr[1][2];
- List<List<Integer>>list=new ArrayList<List<Integer>>();
- List<Integer>list1=new ArrayList<Integer>();
- List<Integer>list2=new ArrayList<Integer>();
- for(int i=0;i<arr[0].length;i++)
- {
- list1.add(arr[0][i]);
- list2.add(arr[1][i]);
- }
- list.add(list1);
- list.add(list2);
- int min=num1<num2?num1:num2;
- if(num1==num2)
- {
- if(end1>start2)
- {
- if(end1>end2)
- list.remove(1);
- else
- {
- list.get(0).set(1, end2);
- list.remove(1);
- }
- }
- }else
- {
- if(end1>start2)
- {
- if(end1<end2)
- {
- if(num1==min)
- {
- list.get(1).set(0, end1+1);
- }
- else
- {
- list.get(0).set(1, start2-1);
- }
- }
- else if(end1>end2)
- {
- if(num1==min)
- list.remove(1);
- else
- {
- list.get(0).set(1, start2-1);
- List<Integer>list3=new ArrayList<Integer>();
- list3.add(start2);
- list3.add(end2);
- list3.add(num2);
- list.add(1, list3);
- list.get(2).set(0, end2+1);
- list.get(2).set(1, end1);
- list.get(2).set(2, num1);
- }
- }
- }
- }
- return list;
- }
- public static void main(String[] args)
- {
- // TODO Auto-generated method stub
- int arr[][]=new int[2][3];
- arr[0]=new int[]{1,30,250};
- arr[1]=new int[]{20,60,250};
- List<List<Integer>>list=RangePrices.rangePrices(arr);
- for(int i=0;i<list.size();i++)
- {
- List<Integer>temp=list.get(i);
- for(int j=0;j<temp.size();j++)
- System.out.print(temp.get(j)+" ");
- System.out.println();
- }
- }
- }