成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

遇到兩次的筆試題:求連續區間

開發 前端
最近除了準備華為面試外,也在面其他公司,每一輪面試都會有幾道筆試題。這些筆試題里面難免有類型相似的。

[[432661]]

最近除了準備華為面試外,也在面其他公司,每一輪面試都會有幾道筆試題。這些筆試題里面難免有類型相似的。

最近我就遇到兩道類型相似的題,都是求連續區間的。

雖然不是啥算法題,但還是比較考驗邏輯能力的,所以這篇文章來梳理一下。

下面是題目,大家可以看下有啥思路沒,就當這是在面試了??。

第一道

輸入是 1,2,3,5,7,8,10 輸出要求是 1~3 5 7~8 10

第二道

將48位的時間位圖格式化成字符串

要求:寫一個函數timeBitmapToRanges,將下述規則描述的時間位圖轉換成一個選中時間區間的數組。

規則描述:

將一天24小時按每半小劃分成48段,我們用一個位圖表示選中的時間區間,例如110000000000000000000000000000000000000000000000, 表示第一個半小時和第二個半小時被選中了,其余時間段都沒有被選中,也就是對應00:00~01:00這個時間區間。一個位圖中可能有多個不連續的 時間區間被選中,例如110010000000000000000000000000000000000000000000,表示00:00-1:00和02:00-02:30這兩個時間區間被選中了。

示例輸入:"110010000000000000000000000000000000000000000000"

示例輸出:["00:00~01:00", "02:00~02:30"]

第一道題的題解

輸入是 1,2,3,5,7,8,10 輸出要求是 1~3 5 7~8 10

這題明顯是要求出連續區間來,然后格式化成字符串。

當 arr[i+1] 是 arr[i] + 1 的時候,那就是連續的,需要繼續往下找。否則就到了區間的邊界,記錄下區間的起始位置就行。

我們循環一遍數組,把區間 push 到數組里

  1. function calcContinuousRanges(arr) { 
  2.     let continuousRanges = []; 
  3.     let index = 0; 
  4.     while(index < arr.length) { 
  5.         const range = { 
  6.             start: arr[index], 
  7.             end: arr[index
  8.         }; 
  9.         continuousRanges.push(range); 
  10.         index++; 
  11.     } 

但是,如果中間有連續的數字,那區間的 end 要做一下調整:

  1. function calcContinuousRanges(arr) { 
  2.     let continuousRanges = []; 
  3.     let index = 0; 
  4.     while( index < arr.length) { 
  5.         const range = { 
  6.             start: arr[index], 
  7.             end: arr[index
  8.         }; 
  9.         while (index < arr.length && arr[index + 1] === arr[index] + 1) { 
  10.             range.end = arr[index + 1]; 
  11.             index++; 
  12.         } 
  13.         continuousRanges.push(range); 
  14.         index++; 
  15.     } 
  16.     console.log(JSON.stringify(continuousRanges)); 

我們先打印一下 continuousRanges:

  1. calcContinuousRanges([1,2,3,5,7,8,10]); 

連續區間是對的:

之后做下格式化就行

  1. const formatted = continuousRanges.map(({start, end}) => { 
  2.     return start === end ? start : `${start}~${end}`; 
  3. }).join(' '); 

完整代碼如下:

  1. function calcContinuousRanges(arr) { 
  2.     let continuousRanges = []; 
  3.     let index = 0; 
  4.     while( index < arr.length) { 
  5.         const range = { 
  6.             start: arr[index], 
  7.             end: arr[index
  8.         }; 
  9.         while (index < arr.length && arr[index + 1] === arr[index] + 1) { 
  10.             range.end = arr[index + 1]; 
  11.             index++; 
  12.         } 
  13.         continuousRanges.push(range); 
  14.         index++; 
  15.     } 
  16.     // console.log(JSON.stringify(continuousRanges)); 
  17.     const formatted = continuousRanges.map(({start, end}) => { 
  18.         return start === end ? start : `${start}~${end}`; 
  19.     }).join(' '); 
  20.     console.log(formatted); 
  21.  
  22. calcContinuousRanges([1,2,3,5,7,8,10]); 

小結

這道題的思路就是先求出連續區間,然后格式化輸出。連續區間就是判斷 arr[i+1] 和 arr[i] 的關系,如果連續就 index++ 繼續往下找,直到找到區間的結束

第二道題的題解

將48位的時間位圖格式化成字符串

要求:寫一個函數timeBitmapToRanges,將下述規則描述的時間位圖轉換成一個選中時間區間的數組。

規則描述:

將一天24小時按每半小劃分成48段,我們用一個位圖表示選中的時間區間,例如110000000000000000000000000000000000000000000000, 表示第一個半小時和第二個半小時被選中了,其余時間段都沒有被選中,也就是對應00:00~01:00這個時間區間。一個位圖中可能有多個不連續的 時間區間被選中,例如110010000000000000000000000000000000000000000000,表示00:00-1:00和02:00-02:30這兩個時間區間被選中了。

示例輸入:"110010000000000000000000000000000000000000000000"

示例輸出:["00:00~01:00", "02:00~02:30"]

這道題也是連續區間的題。先遍歷一遍時間位圖,找到所有的連續時間段的區間,然后格式化成時間的格式輸出就行。

連續區間的話,如果當前位是 1 就記錄下區間的開始,一直 index++ 找區間的結束,直到不為 1,就記錄下一個連續區間。這樣遍歷完一遍就求出了所有連續區間。

格式化成時間的字符串找規律就行。

我們來寫下代碼。

先找連續區間,如果是 0 就 continue,如果是 1 就記錄下區間的開始,然后找區間的結束,之后記錄下連續區間:

  1. function timeBitmapToRanges(timeBitmap) { 
  2.     let index = 0; 
  3.     let ranges = []; 
  4.     while(index < timeBitmap.length) { 
  5.         if (timeBitmap[index] === '0') { 
  6.             index++; 
  7.             continue
  8.         } 
  9.         let curRange = { start: indexendindex}; 
  10.         while (timeBitmap[index] === '1') { 
  11.             curRange.end = index
  12.             index++; 
  13.         } 
  14.         ranges.push(curRange); 
  15.     } 

測試一下,連續區間是對的:

格式化部分找規律即可。

半小時為單位,所以要乘以 0.5,然后區間的結束要多加個 0.5

  1. ranges.map(range => { 
  2.     let str = 0; 
  3.     return format(range.start * 0.5) + '~' + format(range.end * 0.5 + 0.5); 
  4. }); 

然后格式化的實現分為小時和分鐘兩部分:

小時就是整數部分,個位數要補 0;

分鐘是小數部分,只有 30 和 0 兩種情況。

  1. function format(num) { 
  2.     const left = Math.floor(num); 
  3.     const leftStr =   left < 10 ? '0' + left : left
  4.     const right = num % 1 === 0.5 ? 30 : 0; 
  5.     const rightStr =   right < 10 ? '0' + right : right
  6.     return leftStr + ':' + rightStr; 

經測試,結果是對的:

完整代碼如下:

  1. function timeBitmapToRanges(timeBitmap) { 
  2.     let index = 0; 
  3.     let ranges = []; 
  4.     while(index < timeBitmap.length) { 
  5.         if (timeBitmap[index] === '0') { 
  6.             index++; 
  7.             continue
  8.         } 
  9.         let curRange = { start: indexendindex}; 
  10.         while (timeBitmap[index] === '1') { 
  11.             curRange.end = index
  12.             index++; 
  13.         } 
  14.         ranges.push(curRange); 
  15.     } 
  16.  
  17.     return ranges.map(range => { 
  18.         let str = 0; 
  19.         return format(range.start * 0.5) + '~' + format(range.end * 0.5 + 0.5); 
  20.     }); 
  21.  
  22. function format(num) { 
  23.     const left = Math.floor(num); 
  24.     const leftStr =   left < 10 ? '0' + left : left
  25.     const right = num % 1 === 0.5 ? 30 : 0; 
  26.     const rightStr =   right < 10 ? '0' + right : right
  27.     return leftStr + ':' + rightStr; 
  28.  
  29. console.log(timeBitmapToRanges('110010000000000000000000000000000000000000000000')) 

小結

這道題也是求連續區間再格式化輸出的思路,只是連續區間是通過當前位是否為 1 來判斷的,而且格式化的方式也復雜一些。

總結

 

連續區間的題是我最近遇到兩次的筆試題,雖然變形比較多,連續區間的判斷和格式化的方式都不同,但思路是一致的,都是先求出連續區間,然后格式化輸出。

 

責任編輯:武曉燕 來源: 神光的編程秘籍
相關推薦

2009-05-05 10:03:37

主考官求職筆試題

2021-10-21 11:29:06

勒索軟件攻擊數據泄露

2013-12-18 09:36:33

Fedora 20

2013-05-21 11:22:15

Google+UI設計

2015-11-03 11:39:18

清華大學OpenStackEasyStack

2024-10-16 08:38:37

TCP編號信息

2011-04-19 17:57:58

筆試題C++

2021-10-08 11:05:00

Go 切片內存

2024-07-15 00:00:00

POST瀏覽器網絡

2023-02-08 15:32:16

云服務中斷微軟

2021-07-26 08:08:56

TCPIP網絡協議

2021-04-30 13:32:17

TCP三次握手網絡協議

2018-08-13 16:19:35

2020-07-21 10:22:28

網絡安全黑客技術

2021-05-13 16:34:20

TCP客戶端

2018-07-04 13:36:53

程序員項目數據庫

2024-11-21 10:38:10

2012-12-06 10:00:48

InnoDBMySQL
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本一卡精品视频免费 | 色999视频 | 国产在线小视频 | 毛片站| 亚洲日本成人 | 国产精品一区二区三区久久久 | 99久久久久久久 | 精品国产18久久久久久二百 | 国产一区二区三区 | 欧美日韩在线免费 | 精品一区二区三区日本 | 国产成人福利视频在线观看 | 久久99视频这里只有精品 | 午夜影院普通用户体验区 | 国产特黄一级 | 成人精品一区二区三区 | 99re6在线视频精品免费 | 日本黄视频在线观看 | 精品中文字幕视频 | 精品综合| 最新av中文字幕 | 天天玩天天干天天操 | 中文字幕国产精品 | 久久亚洲一区二区三区四区 | 亚洲午夜三级 | 日韩成人在线观看 | 亚洲美乳中文字幕 | 中文字幕乱码一区二区三区 | 玖操| 美女一区| 美女黄网 | 免费a v网站 | 欧美啊v在线观看 | 老头搡老女人毛片视频在线看 | 国产精品久久久免费 | 色婷婷亚洲一区二区三区 | 夜夜操操操 | 久久综合久久综合久久综合 | 91文字幕巨乱亚洲香蕉 | 天天摸天天看 | 国产一区二区三区视频免费观看 |