文章目錄
- 題目
- 題目決議
- 解題思維
- 代碼實作程序(因為細節需要)
- 最后附上代碼
- 代碼細節
題目

?
題目決議
n 表示當前有n個數字(1 ~ n),然后就是開始洗掉數字,
先 正向洗掉:洗掉一個資料,下一個不刪,以此規律,來對這組資料進行洗掉,
然后 反向洗掉 :也是一樣,洗掉一個資料,下一個不刪,只不過是反著來的,
正反向洗掉,交替洗掉,
直到 這組資料,剩余 1 個資料,將其回傳,( 如果 n 一開始 就是 1,就直接回傳 1)
?
解題思維

?
代碼實作程序(因為細節需要)

?
最后附上代碼
class Solution {
public int lastRemaining(int n) {
int firstNum = 1;// 洗掉后,陣列的第一個元素
int k =0;// 洗掉次數,k == 0表示這組資料沒有被洗掉任何元素
int tolerance = 1;// 記錄公差,無論正向還是反向洗掉,每洗掉一次,公差變為自身的兩倍
int curNum = n;//記錄數字個數
while(curNum > 1){
if(k % 2 == 0){//以偶數為 正向洗掉標準,奇數為反向洗掉標志.而且第一次洗掉是正向洗掉,
firstNum += tolerance;
}else{// 奇數 為反向洗掉,需要判斷奇偶性
firstNum = (curNum % 2 ==0) ? firstNum : firstNum + tolerance;
}
k++;
tolerance = tolerance << 1;
curNum = curNum >> 1;
}
return firstNum;
}
}
代碼細節
公差 和 資料個數 利用 二進制移位,進行 2倍擴大 和 縮小,
這個比較基礎,我就粗略的講一下,因為 java 的底層部分,涉及不多,畢竟是站在巨人的肩膀,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/401491.html
標籤:其他
下一篇:多媒體技術(大計基復習資料)


