日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

携程笔试(惨败经历)第一题 leetcode 253

發布時間:2023/12/31 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 携程笔试(惨败经历)第一题 leetcode 253 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

剛開始生怕題做不完,選擇題聽說去年是15分鐘20題,一頓亂選。

第一道選擇題 樹的前序遍歷35421,中序遍歷25431,

后序遍歷應該是....? 這道題是不是有點問題,沒敢仔細看就選了....

編程題更是血炸.....一道都不會。果然刷題不夠多,只看看劍指offer果然不管用啊....第一次筆試就這么拉了。

明天還有美團的筆試,后天的匯報ppt還沒做呢,5555555555555555。

但還是先總結一下吧,編程題第一道。

1.客服人數

輸入一個n表示要輸入的通話記錄個數,接下來輸入n行,每行為逗號相隔的兩個整數,
兩個數字分別代表呼入時間和掛斷時間的時間戳。
舉例:10,30,表示[10,30),代表第10秒呼入,第30秒已經掛斷,
即第30秒可以接入新的來電; 每一行都是一條通話記錄,通話記錄已經按呼入時間由小到大排序
輸出一個整數;代表最少需要多少客服,可以滿足所有旅客來電不用等待。

測試樣例:

6 0,30 0,50 10,20 15,30 20,50 20,65

樣例輸出:

5

之前沒有做過類似的題,完全沒有思路,瞎寫了點代碼,瞎貓撞上死耗子過了50%。

結束后在牛客看到大佬發答案,才知道leetcode 253跟本題高度重合....

這里貼出來找到的一個博主Java實現的代碼

https://blog.csdn.net/qq_41645636/article/details/99475054?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

始終還是缺少點解釋,腦子不靈光的我還是沒理解啊,帶著思考繼續找題解,下面這個博客講的不錯

https://www.cnblogs.com/aaronliu1991/p/11774859.html

恍然大悟,其實本質上是個很簡單的問題。

不管是會議室開會也好,還是客服接電話也好,對于給定的多個時間段序列,需要找到最少的數量會議室或是客服,使得過程不會堵塞,抽象成數學問題本質上是同一個東西。

就按客服接電話這個問題來講,在某個時間段客服接電話了,什么情況下會需要多增加一個客服,防止用戶等待呢?答案是下一個時段端與當前客服時間段重合則需要增加一個客服。比如[5,10]一個客服,那么下一段如果是[9,12]必定需要增加一個客服,如果是[11,12]就不需要增加新的客服。

因為只需要知道最少需要多少客服,因此可以單獨對每個時間段的開始時間和結束時間進行排序。

比如輸入[1,5],[4,7],[9,10],[2,3],單獨對開始時間和結束時間排序,得到如下

startArray=[1,2,4,9]? ?endArray=[3,5,7,10],定義客服數量cnt=0.

然后從最小的開始時間找,如果startArray[startIndex]大于當前的結束時間endArray[endIndex],說明當前不存在重合時間段,那么客服數量不需要增加;如果小于endArray[endIndex],那么說明存在重合時間段,需要增加一個客服。

(最開始startIndex=0,stopIndex=0)當然對于合法輸入,排序后的第一個開始時間肯定小于第一個結束時間,因此stopIndex++,cnt++.

根據上面的輸入序列推一下:

1.startIndex=0,endIndex=0,cnt=0,此時1<3,==>startIndex++;cnt++

2.startIndex=1,endIndex=0,cnt=1,此時2<3,==>startIndex++;cnt++

3.startIndex=2,endIndex=0,cnt=2,此時4>3,==>endIndex++;

4.startIndex=2,endIndex=1,cnt=2,此時4<5,==>startIndex++;cnt++

5.startIndex=3,endIndex=1,cnt=3,此時9>5,==>endIndex++;

6.startIndex=3,endIndex=2,cnt=3,此時9>7,==>endIndex++;

7.startIndex=3,endIndex=3,cnt=3,此時9<10,==>startIndex++;cnt++

退出循環 最后cnt=3。

以上就是題解思路,關鍵代碼其實很少,但是好像確實有點繞,但是想明白了其實很簡單....本人就被繞了一個晚上.....

下面貼出Java程序代碼實現(主函數是用來控制臺輸入的,看關鍵算法代碼即可)

public static void main(String[] args) {Scanner sc =new Scanner(System.in);int count =Integer.parseInt(sc.nextLine().trim());int[][] rows =new int[count][2];for(int i=0;i<count;i++){String row =sc.nextLine();String[] split = row.split(",");rows[i][0]=Integer.parseInt(split[0]);rows[i][1]=Integer.parseInt(split[1]);}int res=0;res = calcMinStaff(rows);System.out.println(String.valueOf(res));}static int calcMinStaff(int[][] rows) {//每一行保存一個時間段,現需要對所有的時間端做一個分割//所有的開始時間放一起,所有的結束時間放一起//然后sortint[] startArray = new int[rows.length];int[] endArray =new int[rows.length];for(int i=0;i<rows.length;i++){startArray[i]=rows[i][0];endArray[i]=rows[i][1];}Arrays.sort(startArray);Arrays.sort(endArray);int cnt =0; //客服數量int eIndex=0;//算法關鍵for(int sIndex=0;sIndex<startArray.length;sIndex++){if(startArray[sIndex]<endArray[eIndex]){cnt++;//需要增加客服}else {eIndex++;//切換到下一個結束時間}}return cnt;}

牛客網的大佬用的貌似是貪心算法求解,看起來好像更能理解一點,地址如下:

https://www.nowcoder.com/discuss/398154?type=all&order=time&pos=&page=1

上面的代碼時間復雜度為O(n2),另外還有一種堆排序的方法,將時間復雜度降到O(nlogn)

另外一個類似問題的介紹

https://www.jianshu.com/p/3948fda91d3d

?

2.海豚數量

明天做完美團筆試再更吧,又要求虐啦/(ㄒoㄒ)/~~

總結

以上是生活随笔為你收集整理的携程笔试(惨败经历)第一题 leetcode 253的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。