筆者自述:
一直有一個聲音也一直能聽到身邊的大佬經(jīng)常說,要把算法學(xué)習(xí)搞好,一定要重視平時的算法學(xué)習(xí),雖然每天也在學(xué)算法,但是感覺自己一直在假裝努力表面功夫騙了自己,沒有規(guī)劃好自己的算法學(xué)習(xí)和總結(jié),因為后半年也該找實習(xí)了,所以每日的算法題要進(jìn)行惡補(bǔ),勤能補(bǔ)拙,因此有了這一個算法日記系列;
必讀: 大佬你好,感謝您的閱讀,這篇文章是我的算法筆記,方便我每日回顧;為了不耽誤您的時間,我把本篇日記的考點方向和算法知識總結(jié)列出來,如果對您有需要要就進(jìn)行閱讀
也希望對您有幫助,和您一起通關(guān)算法!致謝
算法語言:java
題目來源:力扣–書本–初級算法,可以在力扣中搜索相關(guān)題名找到更多解法和大神方法
本文知識點:
-
隨機(jī)數(shù)
random.nextInt(j+1) 表示范圍是從0-j -
交換兩個數(shù)的值
交換兩個數(shù)的值,使用異或操作,^= 效率更高,通過三次的異或操作,可以交換數(shù)組中的兩個值,在不適用額外變量的情況下 -
篩選素數(shù)的方法:
埃拉托斯特尼篩法:從2開始,將每個素數(shù)的各個倍數(shù),標(biāo)記為合數(shù),剩下的未標(biāo)記的就是素數(shù)。 -
位運(yùn)算
可以通過位運(yùn)算和0、1相與的操作來判斷該位上是否是1,>>> 表示無符號右位移,并且在最左邊插入零, >> 表示有符號位移,他們兩個的區(qū)別是 >>> 不考慮符號位,這樣可以保證被移動數(shù)的為模式不變,不會因為符號位的擴(kuò)展而改變其值,>>考慮符號位
打亂數(shù)組
代碼:
class Solution {
private int[] nums;
private Random random;
public Solution(int[] nums) {
this.nums = nums;
random = new Random();
}
public int[] reset() {
return nums;
}
public int[] shuffle() {
if(nums == null){
return null;
}
int []a = nums.clone();
for(int j =1;j<a.length;j++){
int i = random.nextInt(j+1);
swap(a,i,j);
}
return a;
}
private void swap(int []a,int i,int j){
if(i != j){
a[i] ^= a[j];
a[j] ^= a[i];
a[i] ^= a[j];
}
}
}
學(xué)到的知識點:
- random.nextInt(j+1) 表示范圍是從0-j
- 交換兩個數(shù)的值,使用異或操作,^= 效率更高,通過三次的異或操作,可以交換數(shù)組中的兩個值,在不適用額外變量的情況下
計數(shù)質(zhì)數(shù)
代碼:
class Solution {
public int countPrimes(int n){
boolean[] arr = new boolean[n];
int cnt = 0;
//埃拉托斯特尼篩法
for(int i =2;i<n;i++){
if(arr[i])
continue;
cnt++;
for(int j =i;j<n;j+=i){
arr[j] = true;
}
}
return cnt;
}
}
學(xué)到的知識點:
- 篩選素數(shù)的方法:
埃拉托斯特尼篩法:從2開始,將每個素數(shù)的各個倍數(shù),標(biāo)記為合數(shù),剩下的未標(biāo)記的就是素數(shù)。
代碼模版:
for(int i =2;i<n;i++){
if(arr[i])
continue;
cnt++;
for(int j =i;j<n;j+=i){
arr[j] = true;
}
}
位1的個數(shù)
代碼:
// 位1 的個數(shù)
public class day6_12_6 {
//將 n 向右移
public int hammingWeight(int n ){
int count =0;
for(int i =0;i<32;i++){
if(((n>>>i) &1) == 1){
count++;
}
}
return count;
}
//將 1 向左移
public int hammingWeight1(int n){
int count = 0;
for(int i =0;i<32;i++){
if((n%(1<<i)) != 0){
count++;
}
}
return count;
}
}
學(xué)到的知識點:
- 可以通過位運(yùn)算和0、1相與的操作來判斷該位上是否是1,>>> 表示無符號右位移,并且在最左邊插入零, >> 表示有符號位移,他們兩個的區(qū)別是 >>> 不考慮符號位,這樣可以保證被移動數(shù)的為模式不變,不會因為符號位的擴(kuò)展而改變其值,>>考慮符號位
漢明距離
代碼:
class Solution {
public int hammingDistance(int x,int y){
int xor = x^y;
int res = 0;
while(xor != 0){
res+=xor&1;
xor = xor>>>1;
}
return res;
}
}
學(xué)到的知識點:
- 有兩個數(shù),通過異或操作,在二進(jìn)制表達(dá)式中,如果同一對位數(shù)相同經(jīng)過異或操作就是0,不同就是1,所以之后通過無符號移動和1進(jìn)行與操作就可以得出兩個不同的數(shù)之間的二進(jìn)制距離了、
顛倒二進(jìn)制位
代碼:文章來源:http://www.zghlxwxcb.cn/news/detail-547000.html
public class Solution {
// you need treat n as an unsigned value
// res <<= 1;: 這行代碼將 res 左移一位,相當(dāng)于將 res 中的所有位向左移動一個位置。這樣做是為了為下一步的操作騰出一個空位。
// res += n & 1;: 這行代碼將 n 的最低位(即最右邊的位)與 1 進(jìn)行按位與操作,并將結(jié)果加到 res 中。這樣做是為了將 n 的最低位放置到 res 的對應(yīng)位置。
// n >>= 1;: 這行代碼將 n 右移一位,將 n 的所有位都向右移動一個位置。這樣做是為了處理 n 的下一位。
// 通過循環(huán)的迭代,每次將 n 的最低位取出,并將其放置到 res 的對應(yīng)位置上,最終完成了整數(shù)的二進(jìn)制反轉(zhuǎn)。
public int reverseBits(int n){
int res = 0;
for(int i =0;i<32;i++){
res <<=1;
res+=n&1;
n>>=1;
}
return res;
}
}
學(xué)到的知識:文章來源地址http://www.zghlxwxcb.cn/news/detail-547000.html
- 兩個不同的數(shù) 相加,其實底層是位運(yùn)算的相加,這就不難理解,上述代碼中res+=n&1 這一步操作了
到了這里,關(guān)于萬物的算法日記|第一天的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!