去哪儿网2015春季校招笔试--回忆版

去哪儿网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!

代码:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public static int binarySort(int arr[],int target)  
  2.     {  
  3.         int start=0,end=arr.length-1;  
  4.         int mid=0;  
  5.         while(start<=end)  
  6.         {  
  7.             mid=(start+end)/2;  
  8.             if(arr[mid]==target)  
  9.                 return mid;  
  10.             if(target>arr[mid]&&target>arr[end])  
  11.                 end=mid-1;  
  12.             else if(target<arr[mid]&&target<arr[start])  
  13.                 start=mid+1;  
  14.             else if(target>=arr[start]&&target<arr[mid])  
  15.                 end=mid-1;  
  16.             else if(target<=arr[end]&&target>arr[mid])  
  17.                 start=mid+1;  
  18.         }  
  19.         return -1;  
  20.     }  

第二题:public static String decode(String str)

描述:

给字符解密,解密的规则如下,a2bc3c5e6,解密之后的结果是:aabcbcbcccceeeeee,其中整数的值不超过整型的最大值

思路:

就是循环先判断字符串str,再判断数字num,然后循环num次将字符串append到strBuiler上,竟让没有注意到整数最大值不超过整型最大值,它是可以多位数的。。。。。

代码:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public static String decode(String str)  
  2.     {  
  3.         StringBuilder sBuilder =new StringBuilder();  
  4.         StringBuilder sbTemp=new StringBuilder();  
  5.         String strTemp=null;  
  6.         int num=0;  
  7.         int len=str.length();  
  8.         char ch;  
  9.         for(int i=0;i<len;i++)  
  10.         {  
  11.             while(true)  
  12.             {  
  13.                 ch=str.charAt(i);  
  14.                 if((ch>'9'||ch<'0')&&i<len)  
  15.                 {  
  16.                     sbTemp.append(ch);  
  17.                     i++;  
  18.                 }else if(i<len)//修改前只考虑了个位数,题目要求数字是不超过整型的最大值。  
  19.                 {  
  20.                     while(ch>='0'&&ch<='9')  
  21.                     {  
  22.                         num=num*10+ch-'0';  
  23.                         i++;  
  24.                         if(i<len)  
  25.                             ch=str.charAt(i);  
  26.                         else   
  27.                             break;  
  28.                     }  
  29.                     if((ch>'9'||ch<'0'))  
  30.                         i--;  
  31.                     break;  
  32.                       
  33.                 }  
  34.             }  
  35.             strTemp=sbTemp.toString();  
  36.             for(int j=0;j<num;j++)  
  37.                 sBuilder.append(strTemp);  
  38.             num=0;  
  39.             sbTemp.delete(0, sbTemp.length());  
  40.         }  
  41.         return sBuilder.toString();  
  42.     }  

第三题: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的二维数组用的不是很多,改为返回容器了。还有本题的参考代码有可能很不严谨,欢迎拍砖

代码:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class RangePrices  
  2. {  
  3.     public static List<List<Integer>>rangePrices(int arr[][])  
  4.     {  
  5.         int start1=arr[0][0],end1=arr[0][1],num1=arr[0][2];  
  6.         int start2=arr[1][0],end2=arr[1][1],num2=arr[1][2];  
  7.         List<List<Integer>>list=new ArrayList<List<Integer>>();  
  8.         List<Integer>list1=new ArrayList<Integer>();  
  9.         List<Integer>list2=new ArrayList<Integer>();  
  10.         for(int i=0;i<arr[0].length;i++)  
  11.         {  
  12.             list1.add(arr[0][i]);  
  13.             list2.add(arr[1][i]);  
  14.         }  
  15.         list.add(list1);  
  16.         list.add(list2);  
  17.         int min=num1<num2?num1:num2;  
  18.         if(num1==num2)  
  19.         {  
  20.             if(end1>start2)  
  21.             {  
  22.                 if(end1>end2)  
  23.                     list.remove(1);  
  24.                 else  
  25.                 {  
  26.                     list.get(0).set(1, end2);  
  27.                     list.remove(1);  
  28.                 }  
  29.             }  
  30.         }else   
  31.         {  
  32.             if(end1>start2)  
  33.             {  
  34.                 if(end1<end2)  
  35.                 {  
  36.                     if(num1==min)  
  37.                     {  
  38.                         list.get(1).set(0, end1+1);  
  39.                     }  
  40.                     else   
  41.                     {  
  42.                         list.get(0).set(1, start2-1);  
  43.                     }  
  44.                       
  45.                       
  46.                 }  
  47.                 else if(end1>end2)  
  48.                 {  
  49.                     if(num1==min)  
  50.                         list.remove(1);  
  51.                     else   
  52.                     {  
  53.                         list.get(0).set(1, start2-1);  
  54.                         List<Integer>list3=new ArrayList<Integer>();  
  55.                         list3.add(start2);  
  56.                         list3.add(end2);  
  57.                         list3.add(num2);  
  58.                         list.add(1, list3);  
  59.                         list.get(2).set(0, end2+1);  
  60.                         list.get(2).set(1, end1);  
  61.                         list.get(2).set(2, num1);  
  62.                     }  
  63.                       
  64.                       
  65.                 }  
  66.             }  
  67.         }  
  68.         return list;  
  69.     }  
  70.     public static void main(String[] args)  
  71.     {  
  72.         // TODO Auto-generated method stub  
  73.         int arr[][]=new int[2][3];  
  74.         arr[0]=new int[]{1,30,250};  
  75.         arr[1]=new int[]{20,60,250};  
  76.         List<List<Integer>>list=RangePrices.rangePrices(arr);  
  77.         for(int i=0;i<list.size();i++)  
  78.         {  
  79.             List<Integer>temp=list.get(i);  
  80.             for(int j=0;j<temp.size();j++)  
  81.                 System.out.print(temp.get(j)+" ");  
  82.             System.out.println();  
  83.         }  
  84.           
  85.     }  
  86.   
  87. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值