網(wǎng)站建設(shè) 云計算搜索數(shù)據(jù)
前言
本篇文章記錄下我在筆試過程中遇到的真實題目,供大家參考。
1、題目
系統(tǒng)給定一個數(shù)組,需要我們編寫一個函數(shù),該函數(shù)每次調(diào)用,隨機從該數(shù)組中獲取一個數(shù),且不能與上一次的取數(shù)相同。
2、思路解析
數(shù)組已經(jīng)有了,我們首先想到的就是通過使用 Math.random()
方法來獲取一個隨機數(shù),而且這個隨機數(shù)的范圍要在數(shù)組的長度范圍內(nèi),這樣才能根據(jù)數(shù)組的下標(biāo)獲取到對應(yīng)的數(shù)組的值。
我們知道,Math.random()
方法是獲取 0 ~ 1
之間的隨機數(shù),包含 0 但不包含 1
如何才能獲取到 0 ~ 數(shù)組長度-1 區(qū)間范圍內(nèi)的隨機數(shù)呢?而且還需要是整數(shù)。
顯然,此時我們已經(jīng)有了獲取 0 ~ 1 之間的隨機數(shù),當(dāng)這個隨機數(shù) 乘以 數(shù)組長度的時候,我們就可以獲取一個 0 ~ 數(shù)組長度之間的隨機數(shù)。
下一個方向是:保證每次獲取的隨機數(shù)都是整數(shù)
Math還提供了另外三個方法:Math.floor()
、 Math.ceil()
、Math.round()
- Math.floor():向下取整,即小數(shù)部分直接舍棄。
- Math.ceil():向上取整,即舍棄小數(shù)部分,同時整數(shù)部分 + 1
- Math.round():四舍五入,返回四舍五入后的整數(shù)
針對于我們應(yīng)該使用哪個方法:我們可以思考下:
Math.random()
方法產(chǎn)生的隨機數(shù),包含0,卻不包含1,這意味著,當(dāng)我們再乘以數(shù)組長度的時候,得到的樹,永遠也不會包含數(shù)組長度的值。即:如果數(shù)組長度為 5 ,我們得到的隨機數(shù)永遠也不會為 5。
顯而易見,此時使用 Math.floor()
方法向下取整,我們獲取的隨機整數(shù),永遠都會是數(shù)組的下標(biāo)。
重點:如何讓本次取到的數(shù),和上次不同
這里面有兩個不同的地方:
1. 當(dāng)數(shù)組中的元素都是不同元素時
2. 當(dāng)數(shù)組中有相同元素時
所以需要數(shù)組去重,校驗下,必須保證數(shù)組中起碼有三個不同的數(shù)字。
思路:定義一個變量:存放上次取的隨機數(shù),每次調(diào)用該方法時,進行對比,如果相等,則代表和上次取數(shù)一樣,此時再次調(diào)用該函數(shù)(遞歸),如果不等,則返回。
3. 代碼實例
const data = [1,2,3,4,5,6,1,2]let lastNum = null; // 用于存放上次的取數(shù)
const getRandomNum = (arr) => { if(!arr.length) return; // 封裝方法時的習(xí)慣性寫法,可不寫let newArr = (data) => [...new Set(data)] // 去重if(newArr(arr).length < 3) return; // 確保數(shù)組的不同元素超過三個let random = Math.floor(Math.random() * arr.length) // 獲取 0~數(shù)組長度-1 的隨機數(shù)if(lastNum == arr[random]) {return getRandomNum(arr)}lastNum = arr[random]return arr[random]
}console.log(getRandomNum(data))
console.log(getRandomNum(data))
console.log(getRandomNum(data))
console.log(getRandomNum(data))
console.log(getRandomNum(data))
console.log(getRandomNum(data))
console.log(getRandomNum(data))
console.log(getRandomNum(data))
console.log(getRandomNum(data))
console.log(getRandomNum(data))
console.log(getRandomNum(data))
console.log(getRandomNum(data))
效果如下所示: