自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

[[432661]]

最近除了準(zhǔn)備華為面試外,也在面其他公司,每一輪面試都會(huì)有幾道筆試題。這些筆試題里面難免有類(lèi)型相似的。

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

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

下面是題目,大家可以看下有啥思路沒(méi),就當(dāng)這是在面試了??。

第一道

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

第二道

將48位的時(shí)間位圖格式化成字符串

要求:寫(xiě)一個(gè)函數(shù)timeBitmapToRanges,將下述規(guī)則描述的時(shí)間位圖轉(zhuǎn)換成一個(gè)選中時(shí)間區(qū)間的數(shù)組。

規(guī)則描述:

將一天24小時(shí)按每半小劃分成48段,我們用一個(gè)位圖表示選中的時(shí)間區(qū)間,例如110000000000000000000000000000000000000000000000, 表示第一個(gè)半小時(shí)和第二個(gè)半小時(shí)被選中了,其余時(shí)間段都沒(méi)有被選中,也就是對(duì)應(yīng)00:00~01:00這個(gè)時(shí)間區(qū)間。一個(gè)位圖中可能有多個(gè)不連續(xù)的 時(shí)間區(qū)間被選中,例如110010000000000000000000000000000000000000000000,表示00:00-1:00和02:00-02:30這兩個(gè)時(shí)間區(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ū)間來(lái),然后格式化成字符串。

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

我們循環(huán)一遍數(shù)組,把區(qū)間 push 到數(shù)組里

  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ù)的數(shù)字,那區(qū)間的 end 要做一下調(diào)整:

  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ū)間是對(duì)的:

之后做下格式化就行

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

小結(jié)

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

第二道題的題解

將48位的時(shí)間位圖格式化成字符串

要求:寫(xiě)一個(gè)函數(shù)timeBitmapToRanges,將下述規(guī)則描述的時(shí)間位圖轉(zhuǎn)換成一個(gè)選中時(shí)間區(qū)間的數(shù)組。

規(guī)則描述:

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

示例輸入:"110010000000000000000000000000000000000000000000"

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

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

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

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

我們來(lái)寫(xiě)下代碼。

先找連續(xù)區(qū)間,如果是 0 就 continue,如果是 1 就記錄下區(qū)間的開(kāi)始,然后找區(qū)間的結(jié)束,之后記錄下連續(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.     } 

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

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

半小時(shí)為單位,所以要乘以 0.5,然后區(qū)間的結(jié)束要多加個(gè) 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. }); 

然后格式化的實(shí)現(xiàn)分為小時(shí)和分鐘兩部分:

小時(shí)就是整數(shù)部分,個(gè)位數(shù)要補(bǔ) 0;

分鐘是小數(shù)部分,只有 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; 

經(jīng)測(cè)試,結(jié)果是對(duì)的:

完整代碼如下:

  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')) 

小結(jié)

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

總結(jié)

 

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

 

責(zé)任編輯:武曉燕 來(lái)源: 神光的編程秘籍
相關(guān)推薦

2009-05-05 10:03:37

主考官求職筆試題

2021-10-21 11:29:06

勒索軟件攻擊數(shù)據(jù)泄露

2013-12-18 09:36:33

Fedora 20

2013-05-21 11:22:15

Google+UI設(shè)計(jì)

2024-10-16 08:38:37

TCP編號(hào)信息

2015-11-03 11:39:18

清華大學(xué)OpenStackEasyStack

2011-04-19 17:57:58

筆試題C++

2021-10-08 11:05:00

Go 切片內(nèi)存

2024-07-15 00:00:00

POST瀏覽器網(wǎng)絡(luò)

2023-02-08 15:32:16

云服務(wù)中斷微軟

2021-07-26 08:08:56

TCPIP網(wǎng)絡(luò)協(xié)議

2021-04-30 13:32:17

TCP三次握手網(wǎng)絡(luò)協(xié)議

2018-08-13 16:19:35

2020-07-21 10:22:28

網(wǎng)絡(luò)安全黑客技術(shù)

2012-07-04 15:33:11

亞馬遜斷網(wǎng)云計(jì)算

2012-12-06 10:00:48

InnoDBMySQL

2010-09-25 15:42:26

數(shù)據(jù)庫(kù)集群Facebook

2021-05-13 16:34:20

TCP客戶(hù)端
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)