leetcode演算法小基礎第一題

2021-10-10 07:52:37 字數 951 閱讀 3815

玩玩演算法入門題,下面是問題

給你乙個整數陣列 arr 。請你將陣列中的元素按照其二進位制表示中數字 1 的數目公升序排序。

如果存在多個數字二進位制中 1 的數目相同,則必須將它們按照數值大小公升序排列。

請你返回排序後的陣列。

這道題是leetcode上很基礎的題,我也剛做完,熱乎的,上手用吧,我也是才拾起來演算法,所以作為第乙個題,就記錄一下,接下來走流程

分析題目,陣列裡按二進位制1的數目公升序,也就排序嗎,二進位制1就是用元素除以2,一直除,除到除不盡為止,判斷每個數有幾個1嗎就是,這裡面有個規律,只要是整數,你除以2,只要你能除以2一直除到取整結果等於0 ,也就結束了,貼乙個官方的演算法

public static int  check1(int x) else if(a==1)

if(a%2!=0)else if(a/2!=1)else

return b;

}其實就是乙個十進位製到二進位制的轉換,13=1101,13/2餘數是1 就是二進位制的末尾的1,然後13就變成了6,6就是末尾以外的數110,6除以2的餘數0,就是110的0,6變成了3,3=11,類推下去,演算法就有了

我就用遞迴,也挺有意思的,b初始化都是0,a就是陣列元素,反正總結起來我的思路就是,要麼除以2等於1結束,中間取餘數,很簡單,但是作為多年不碰的我,搗鼓起來也弄了一小時

這道題考了乙個排序,乙個取2,方法很多,歡迎指教,等我有時間再研究別的辦法了

2020-11-12

記錄乙個演算法

public static int  check(int x) {

int res = 0;

while (x != 0) {

res++;

x^=x&((~x)+1);

return res;

看看能看懂嗎

取反+1其實就是取乙個數轉化成二進位制以後最後一位是1的數,這樣與上原數就把最後一位是1的位置0,然後迴圈下去,一直到==0

LeetCode小演算法記錄(一)

給定兩個排序後的陣列 a 和 b,其中 a 的末端有足夠的緩衝空間容納 b。編寫乙個方法,將 b 合併入 a 並排序。初始化 a 和 b 的元素數量分別為 m 和 n。示例 輸入 a 1,2,3,0,0,0 m 3 b 2,5,6 n 3 輸出 1,2,2,3,5,6 package leetcod...

演算法基礎課 第一章 基礎演算法(一)

在q l r 中 確定分界點 q l q l r 2 q r 隨機 調整區間 使得分界點x的左側,數值皆 x,右側皆 x i j兩者從左 右兩個方向分別尋找不符合的數字,然後兩者交換,直至相遇 遞迴處理左右兩段 模板 如下 一定記牢 void quick sort int q,int l,int r...

第一章 基礎演算法(一)

題目 給定乙個按照公升序排列的長度為n的整數陣列,以及 q 個查詢。對於每個查詢,返回乙個元素k的起始位置和終止位置 位置從0開始計數 如果陣列中不存在該元素,則返回 1 1 輸入格式 第一行包含整數n和q,表示陣列長度和詢問個數。第二行包含n個整數 均在1 10000範圍內 表示完整陣列。接下來q...