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

遇到兩次的筆試題:求連續(xù)區(qū)間

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

[[432661]]

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

最近我就遇到兩道類型相似的題,都是求連續(xù)區(qū)間的。

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

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

第一道

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

第二道

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

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

規(guī)則描述:

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

示例輸入:"110010000000000000000000000000000000000000000000"

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

第一道題的題解

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

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

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

我們循環(huán)一遍數組,把區(qū)間 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.     } 

但是,如果中間有連續(xù)的數字,那區(qū)間的 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]); 

連續(xù)區(qū)間是對的:

之后做下格式化就行

  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]); 

小結

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

第二道題的題解

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

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

規(guī)則描述:

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

示例輸入:"110010000000000000000000000000000000000000000000"

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

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

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

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

我們來寫下代碼。

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

  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.     } 

測試一下,連續(xù)區(qū)間是對的:

格式化部分找規(guī)律即可。

半小時為單位,所以要乘以 0.5,然后區(qū)間的結束要多加個 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')) 

小結

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

總結

 

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

 

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

2009-05-05 10:03:37

主考官求職筆試題

2021-10-21 11:29:06

勒索軟件攻擊數據泄露

2013-12-18 09:36:33

Fedora 20

2015-11-03 11:39:18

清華大學OpenStackEasyStack

2013-05-21 11:22:15

Google+UI設計

2024-10-16 08:38:37

TCP編號信息

2011-04-19 17:57:58

筆試題C++

2023-02-08 15:32:16

云服務中斷微軟

2021-10-08 11:05:00

Go 切片內存

2024-07-15 00:00:00

POST瀏覽器網絡

2020-07-21 10:22:28

網絡安全黑客技術

2021-07-26 08:08:56

TCPIP網絡協議

2021-04-30 13:32:17

TCP三次握手網絡協議

2018-08-13 16:19:35

2021-05-13 16:34:20

TCP客戶端

2024-11-21 10:38:10

2018-07-04 13:36:53

程序員項目數據庫

2012-12-06 10:00:48

InnoDBMySQL
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区在线播放视频 | 精品亚洲91 | 狠狠爱综合网 | 欧美日韩综合 | 国产精品成人国产乱一区 | 黄色综合 | 91久久 | 日韩精品a在线观看图片 | 国产在线高清 | 殴美成人在线视频 | 激情欧美一区二区三区中文字幕 | 免费在线观看av片 | 国产成人精品久久 | 精品福利视频一区二区三区 | 日日日日日日bbbbb视频 | 日韩午夜电影在线观看 | 麻豆一区二区三区精品视频 | 日韩欧美视频 | 久久亚洲一区二区三 | 一级毛片网 | 精品久久久久久久 | 午夜在线影院 | 久久久精品一区 | 91国内产香蕉 | 成av在线 | 欧美一区二区在线观看 | 亚洲精品一区二区三区 | 欧美人妇做爰xxxⅹ性高电影 | 国产片一区二区三区 | 亚洲少妇综合网 | 欲色av| 影音先锋亚洲资源 | 日韩一二三区 | 日韩爱爱网 | 不卡在线视频 | 国产精品视频97 | 亚洲激情在线 | 国产最新视频在线 | 中文字幕在线免费观看 | 亚洲精品久久嫩草网站秘色 | 毛片日韩 |