日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

給Java小白,整理一套能上手的簡(jiǎn)單編程算法題【含答案】?。?!

 小傅哥 2021-12-13


作者:小傅哥
博客:https://

沉淀、分享、成長(zhǎng),讓自己和他人都能有所收獲!😄

一、前言

數(shù)學(xué)離程序員有多近?

ifelse也好、for循環(huán)也罷,代碼可以說(shuō)就是對(duì)數(shù)學(xué)邏輯的具體實(shí)現(xiàn)。所以敲代碼的程序員幾乎就離不開(kāi)數(shù)學(xué),難易不同而已。

那數(shù)學(xué)不好就寫不了代碼嗎😳?不,一樣可以寫代碼,可以寫出更多的CRUD出來(lái)。那你不要總覺(jué)得是產(chǎn)品需求簡(jiǎn)單所以你的實(shí)現(xiàn)過(guò)程才變成了增刪改查,往往也是因?yàn)槟氵€不具備可擴(kuò)展、易維護(hù)、高性能的代碼實(shí)現(xiàn)方案落地能力,才使得你小小年紀(jì)寫出了更多的CRUD

與一錐子買賣的小作坊相比,大廠和超級(jí)大廠更會(huì)注重?cái)?shù)學(xué)能力。

first 10-digit prime found in consecutive digits of e

2004年,在硅谷的交通動(dòng)脈 101 公路上突然出現(xiàn)一塊巨大的廣告牌,上面是一道數(shù)學(xué)題:{e 的連續(xù)數(shù)字中最先出現(xiàn)的 10 位質(zhì)數(shù)}.com。

廣告:這里的 e 是數(shù)學(xué)常數(shù),自然對(duì)數(shù)的底數(shù),無(wú)限不循環(huán)小數(shù)。這道題的意思就是,找出 e 中最先出現(xiàn)的 10 位質(zhì)數(shù),然后可以得出一個(gè)網(wǎng)址。進(jìn)入這個(gè)網(wǎng)址會(huì)看到 Google 為你出的第二道數(shù)學(xué)題,成功解鎖這步 Google 會(huì)告訴你,我們或許是”志同道合“的人,你可以將簡(jiǎn)歷發(fā)到這個(gè)郵箱,我們一起做點(diǎn)改變世界的事情。

計(jì)算 e 值可以通過(guò)泰勒公式推導(dǎo)出來(lái):e^x≈1 + x + x^2/2! + x^3/3! +……+ x^n/n! (1) 推導(dǎo)計(jì)算過(guò)程還包括埃拉托色尼篩選法(the Sieve of Eratosthenes)、線性篩選法的使用。感興趣的小伙伴可以用代碼實(shí)現(xiàn)下。

二、編程練習(xí)題

1. 斐波那契數(shù)列

@Test
public void test_Fibonacci() {
    int month = 15;  // 15個(gè)月
    long f1 = 1L, f2 = 1L;
    long f;
    for (int i = 3; i < month; i++) {
        f = f2;
        f2 = f1 + f2;
        f1 = f;
        System.out.println("第" + i + "個(gè)月的兔子對(duì)數(shù): " + f2);
    }
}
  • 難度:?????
  • 題目:有一對(duì)兔子,從出生后第3個(gè)月起每個(gè)月都生一對(duì)兔子,小兔子長(zhǎng)到第三個(gè)月后每個(gè)月又生一對(duì)兔子,假如兔子都不死,問(wèn)每個(gè)月的兔子總數(shù)為多少?
  • 邏輯:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)
  • 擴(kuò)展斐波那契數(shù)列(Fibonacci sequence),又稱黃金分割數(shù)列,因數(shù)學(xué)家萊昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數(shù)列”,指的是這樣一個(gè)數(shù)列:0、1、1、2、3、5、8、13、21、34、……在數(shù)學(xué)上,斐波那契數(shù)列以如下被以遞推的方法定義:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)在現(xiàn)代物理、準(zhǔn)晶體結(jié)構(gòu)、化學(xué)等領(lǐng)域,斐波納契數(shù)列都有直接的應(yīng)用,為此,美國(guó)數(shù)學(xué)會(huì)從 1963 年起出版了以《斐波納契數(shù)列季刊》為名的一份數(shù)學(xué)雜志,用于專門刊載這方面的研究成果。

2. 判斷素?cái)?shù)

@Test
public void test_Prime() {
    int count = 0;
    for (int i = 101; i < 200; i++) {
        boolean b = true;// 默認(rèn)此數(shù)就素?cái)?shù)
        for (int j = 2; j <= Math.sqrt(i); j++) {
            if (i % j == 0) {
                b = false; // 此數(shù)不是素?cái)?shù)
                break;
            }
        }
        if (b) {
            count++;
            System.out.print(i + " ");
        }
    }
    System.out.println("\n素?cái)?shù)的個(gè)數(shù):" + count);
}
  • 難度:???
  • 題目:判斷101-200之間有多少個(gè)素?cái)?shù),并輸出所有素?cái)?shù)。
  • 邏輯:判斷素?cái)?shù)的方法,用一個(gè)數(shù)分別去除2到sqrt(這個(gè)數(shù)),如果能被整除,則表明此數(shù)不是素?cái)?shù),反之是素?cái)?shù)。
  • 擴(kuò)展:素?cái)?shù)又稱質(zhì)數(shù),質(zhì)數(shù)的個(gè)數(shù)是無(wú)窮的。歐幾里得的《幾何原本》中有一個(gè)經(jīng)典的證明。它使用了證明常用的方法:反證法。具體證明如下:假設(shè)質(zhì)數(shù)只有有限的n個(gè),從小到大依次排列為p1,p2,……,pn,設(shè)N=p1×p2×……×pn,那么, 是素?cái)?shù)或者不是素?cái)?shù)。

3. 水仙花數(shù)

@Test
public void test_narcissus() {
    for (int num = 101; num < 1000; num++) {
        int bbb = num / 100;
        int bb = (num % 100) / 10;
        int b = (num % 100) % 10;
        if ((bbb * bbb * bbb + bb * bb * bb + b * b * b) == num) {
            System.out.println(num);
        }
    }
}
  • 難度:????
  • 題目:打印出所有的"水仙花數(shù)(narcissus number)",所謂"水仙花數(shù)"是指一個(gè)三位數(shù),其各位數(shù)字立方和等于該數(shù)本身。例如:153是一個(gè)"水仙花數(shù)",因?yàn)?53=1的三次方+5的三次方+3的三次方。
  • 邏輯:利用for循環(huán)控制100-999個(gè)數(shù),每個(gè)數(shù)分解出個(gè)位,十位,百位。
  • 擴(kuò)展:水仙花數(shù)(Narcissistic number)也被稱為超完全數(shù)字不變數(shù)(pluperfect digital invariant, PPDI)、自戀數(shù)、自冪數(shù)、阿姆斯壯數(shù)或阿姆斯特朗數(shù)(Armstrong number),水仙花數(shù)是指一個(gè) 3 位數(shù),它的每個(gè)位上的數(shù)字的 3次冪之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)。

4. 分解質(zhì)因數(shù)

@Test
public void test_ZhiYinShu() {
    f(200);
}
int k = 2;
public void f(int n) {
    while (k <= n) {
        if (k == n) {
            System.out.println(n);
            break;
        } else if (n > k && n % k == 
            System.out.print(k + "*")
            n = n / k;
            f(n);
            break;
        } else if (n > k && n % k != 
            k++;
            f(n);
            break;
        }
    }
}
  • 難度:????
  • 題目:將一個(gè)正整數(shù)分解質(zhì)因數(shù)。例如:輸入90,打印出90=233*5。
  • 邏輯:對(duì)n進(jìn)行分解質(zhì)因數(shù),應(yīng)先找到一個(gè)最小的質(zhì)數(shù)k,然后按此步驟完成(1)如果這個(gè)質(zhì)數(shù)恰等于n,則說(shuō)明分解質(zhì)因數(shù)的過(guò)程已經(jīng)結(jié)束,打印出即可。(2)如果n>k,但n能被k整除,則應(yīng)打印出k的值,并用n除以k的商,作為新的正整數(shù)你n,重復(fù)執(zhí)行第一步。(3)如果n不能被k整除,則用k+1作為k的值,重復(fù)執(zhí)行第一步。
  • 擴(kuò)展:每個(gè)合數(shù)都可以寫成幾個(gè)質(zhì)數(shù)相乘的形式,其中每個(gè)質(zhì)數(shù)都是這個(gè)合數(shù)的因數(shù),把一個(gè)合數(shù)用質(zhì)因數(shù)相乘的形式表示出來(lái),叫做分解質(zhì)因數(shù)。如30=2×3×5 。分解質(zhì)因數(shù)只針對(duì)合數(shù)。

5. 楊輝三角

 @Test
 public void test_YangHuiSanJiao(){
     int[][] a = new int[10][10];
     for (int i = 0; i < 10; i++) {
         a[i][i] = 1;
         a[i][0] = 1;
     }
     for (int i = 2; i < 10; i++) {
         for (int j = 1; j < i; j++) {
             a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
         }
     }
     for (int i = 0; i < 10; i++) {
         for (int k = 0; k < 2 * (10 - i) - 1; k++) {
             System.out.print(" ");
         }
         for (int j = 0; j <= i; j++) {
             System.out.print(a[i][j] + "   ");
         }
         System.out.println();
     }
 }
  • 難度:????
  • 題目:打印出楊輝三角形
  • 邏輯:楊輝三角形性質(zhì):每行數(shù)字左右對(duì)稱,由1開(kāi)始逐漸變大,然后變小,回到1。第n行的數(shù)字個(gè)數(shù)為n個(gè)。第n行數(shù)字和為2^(n-1)。每個(gè)數(shù)字等于上一行的左右兩個(gè)數(shù)字之和。可用此性質(zhì)寫出整個(gè)楊輝三角形。第n行的第1個(gè)數(shù)為1,第二個(gè)數(shù)為1×(n-1),第三個(gè)數(shù)為1×(n-1)×(n-2)/2,第四個(gè)數(shù)為1×(n-1)×(n-2)/2×(n-3)/3…依此類推。
  • 擴(kuò)展:楊輝三角,是二項(xiàng)式系數(shù)在三角形中的一種幾何排列,中國(guó)南宋數(shù)學(xué)家楊輝1261年所著的《詳解九章算法》一書中出現(xiàn)。在歐洲,帕斯卡(1623----1662)在1654年發(fā)現(xiàn)這一規(guī)律,所以這個(gè)表又叫做帕斯卡三角形。帕斯卡的發(fā)現(xiàn)比楊輝要遲393年,比賈憲遲600年。

6. 求最大公約數(shù)與最小公倍數(shù)

@Test
public void test_Prime() {
    int a = 10, b = 24;
    int m = division(a, b);
    int n = a * b / m;
    System.out.println("最大公約數(shù): " + m);
    System.out.println("最小公倍數(shù): " + n);
}
public int division(int x, int y) {
    int t;
    if (x < y) {
        t = x;
        x = y;
        y = t;
    }
    while (y != 0) {
        if (x == y)
            return 1;
        else {
            int k = x % y;
            x = y;
            y = k;
        }
    }
    return x;
}
  • 難度:???
  • 題目:兩個(gè)正整數(shù)m和n,求其最大公約數(shù)和最小公倍數(shù)。
  • 邏輯:在循環(huán)中,只要除數(shù)不等于0,用較大數(shù)除以較小的數(shù),將小的一個(gè)數(shù)作為下一輪循環(huán)的大數(shù),取得的余數(shù)作為下一輪循環(huán)的較小的數(shù),如此循環(huán)直到較小的數(shù)的值為0,返回較大的數(shù),此數(shù)即為最小公約數(shù),最小公倍數(shù)為兩數(shù)之積除以最小公倍數(shù)。
  • 擴(kuò)展:最大公因數(shù),也稱最大公約數(shù)、最大公因子,指兩個(gè)或多個(gè)整數(shù)共有約數(shù)中最大的一個(gè)。a,b的最大公約數(shù)記為(a,b),同樣的,a,b,c的最大公約數(shù)記為(a,b,c),多個(gè)整數(shù)的最大公約數(shù)也有同樣的記號(hào)。求最大公約數(shù)有多種方法,常見(jiàn)的有質(zhì)因數(shù)分解法、短除法、輾轉(zhuǎn)相除法、更相減損法。與最大公約數(shù)相對(duì)應(yīng)的概念是最小公倍數(shù),a,b的最小公倍數(shù)記為[a,b]。兩個(gè)或多個(gè)整數(shù)公有的倍數(shù)叫做它們的公倍數(shù),其中除0以外最小的一個(gè)公倍數(shù)就叫做這幾個(gè)整數(shù)的最小公倍數(shù)。整數(shù)a,b的最小公倍數(shù)記為[a,b],同樣的,a,b,c的最小公倍數(shù)記為[a,b,c],多個(gè)整數(shù)的最小公倍數(shù)也有同樣的記號(hào)。

7. 完全平方數(shù)

@Test
public void test_PerfectSquare() {
    for (long l = 1L; l < 100000; l++) {
        if (Math.sqrt((l + 100)) % 1 == 0) {
            if (Math.sqrt((l + 268)) % 1 == 0) {
                System.out.println(l + "加100是一個(gè)完全平方數(shù),再加168又是一個(gè)完全平方數(shù)");
            }
        }
    }
}
  • 難度:????
  • 題目:一個(gè)整數(shù),它加上100后是一個(gè)完全平方數(shù),再加上168又是一個(gè)完全平方數(shù),請(qǐng)問(wèn)該數(shù)是多少?
  • 邏輯:在10萬(wàn)以內(nèi)判斷,先將該數(shù)加上100后再開(kāi)方,再將該數(shù)加上268后再開(kāi)方,如果開(kāi)方后的結(jié)果滿足如下條件,即是結(jié)果。
  • 擴(kuò)展:完全平方指用一個(gè)整數(shù)乘以自己例如11,22,3*3等,依此類推。若一個(gè)數(shù)能表示成某個(gè)整數(shù)的平方的形式,則稱這個(gè)數(shù)為完全平方數(shù)。完全平方數(shù)是非負(fù)數(shù),而一個(gè)完全平方數(shù)的項(xiàng)有兩個(gè)。注意不要與完全平方式所混淆。

8. 求主對(duì)角線之和

@Test
public void test_Sum() {
    Scanner s = new Scanner(System.in);
    int[][] a = new int[3][3];
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            a[i][j] = s.nextInt();
        }
    }
    System.out.println("輸入的3 * 3 矩陣是:");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            System.out.print(a[i][j] + " ");
        }
        System.out.println();
    }
    int sum = 0;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (i == j) {
                sum += a[i][j];
            }
        }
    }
    System.out.println("對(duì)角線和是 " + sum);
}
  • 難度:???
  • 題目:求一個(gè)3*3矩陣對(duì)角線元素之和
  • 邏輯:利用雙重for循環(huán)控制輸入二維數(shù)組,再將a[i][i]累加后輸出。
  • 擴(kuò)展:在一個(gè)n階方陣(或是n階行列式)中,從左上角到右下角這一斜線方向上的n 個(gè)元素所在的對(duì)角線,叫做n 階方陣(或行列式)的主對(duì)角線。

9. 完數(shù)求解

@Test
public void test_solution() {
    System.out.println("1到1000的完數(shù)有: ");
    for (int i = 1; i < 1000; i++) {
        int t = 0;
        for (int j = 1; j <= i / 2; j++) {
            if (i % j == 0) {
                t = t + j;
            }
        }
        if (t == i) {
            System.out.print(i + " ");
        }
    }
}
  • 難度:????
  • 題目:一個(gè)數(shù)如果恰好等于它的因子之和,這個(gè)數(shù)就稱為 "完數(shù) "。例如6=1+2+3.編程 找出1000以內(nèi)的所有完數(shù)
  • 邏輯:如果p是質(zhì)數(shù),且2p-1也是質(zhì)數(shù),那么(2p-1)X2^(p-1)便是一個(gè)完全數(shù)。
  • 擴(kuò)展:完全數(shù)(Perfect number),又稱完美數(shù)或完備數(shù),是一些特殊的自然數(shù)。它所有的真因子(即除了自身以外的約數(shù))的和(即因子函數(shù)),恰好等于它本身。

10. 求s=a+aa+aaa+aaaa+aa…a的值

@Test
public void test_asum() {
    long a = 2, b = 0;
    Scanner s = new Scanner(System.in);
    int n = s.nextInt();
    int i = 0;
    long sum = 0;
    while (i < n) {
        b = b + a;
        sum = sum + b;
        a = a * 10;
        ++i;
    }
    System.out.println("input number: " + n);
    System.out.println(sum);
}
  • 難度:???
  • 題目:求s=a+aa+aaa+aaaa+aa…a的值,其中a是一個(gè)數(shù)字。例如2+22+222+2222+22222(此時(shí)共有5個(gè)數(shù)相加),幾個(gè)數(shù)相加有鍵盤控制。
  • 邏輯:定義一個(gè)變量b, 賦初值為0;定義一變量sum, 賦初值為0,進(jìn)入循環(huán)后,將a + b 的值賦給b,將sum + b 的值賦給sum;同時(shí),將a 增加十倍, ++ i; 繼續(xù)循環(huán);循環(huán)結(jié)束后,輸出sum 的值。

11. 無(wú)重復(fù)三位數(shù)

@Test
public void test_AC() {
    int count = 0;
    for (int x = 1; x < 5; x++) {
        for (int y = 1; y < 5; y++) {
            for (int z = 1; z < 5; z++) {
                if (x != y && y != z && x != z) {
                    count++;
                    System.out.print(x * 100 + y * 10 + z + "   ");
                    if (count % 4 == 0) {
                        System.out.println();
                    }
                }
            }
        }
    }
    System.out.println("共有" + count + "個(gè)三位數(shù)");
}
  • 難度:????
  • 題目:有1、2、3、4個(gè)數(shù)字,能組成多少個(gè)互不相同且無(wú)重復(fù)數(shù)字的三位數(shù)?都是多少?
  • 邏輯:可填在百位、十位、個(gè)位的數(shù)字都是1、2、3、4。組成所有的排列后再去掉不滿足條件的排列。

12. 從小到大輸出數(shù)列

public class SmallToBig {
public static void main(String[] args) {
SmallToBig fnc = new SmallToBig();
int a, b, c;

System.out.println("Input 3 numbers:");
a = fnc.input();
b = fnc.input();
c = fnc.input();

if (a > b) {
int t = a;
a = b;
b = t;
}

if (a > c) {
int t = a;
a = c;
c = t;
}

if (b > c) {
int t = b;
b = c;
c = t;
}
System.out.println(a + " " + b + " " + c);
}

public int input() {
int value = 0;
Scanner s = new Scanner(System.in);
value = s.nextInt();
return value;
}

public void compare(int x, int y) {// 此方法沒(méi)用
if (x > y) {
int t = x;
x = y;
y = t;
}
}
}
  • 難度:??
  • 題目:輸入三個(gè)整數(shù)x,y,z,請(qǐng)把這三個(gè)數(shù)由小到大輸出
  • 邏輯:辦法把最小的數(shù)放到x上,先將x與y進(jìn)行比較,如果x> y則將x與y的值進(jìn)行交換,然后再用x與z進(jìn)行比較,如果x> z則將x與z的值進(jìn)行交換,這樣能使x最小。

13. 猴子吃桃問(wèn)題

public class Monkey {

public static void main(String[] args) {
int lastdayNum = 1;
for (int i = 2; i <= 10; i++) {
lastdayNum = (lastdayNum + 1) * 2;
}
System.out.println("猴子第一天摘了 " + lastdayNum + " 個(gè)桃子");
}
}

  • 難度:????
  • 題目:猴子第一天摘下若干個(gè)桃子,當(dāng)即吃了一半,還不癮,又多吃了一個(gè) 第二天早上又將剩下的桃子吃掉一半,又多吃了一個(gè)。以后每天早上都吃了前一天剩下 的一半零一個(gè)。到第10天早上想再吃時(shí),見(jiàn)只剩下一個(gè)桃子了。求第一天共摘了多少。
  • 邏輯:采取逆向思維的方法,從后往前推斷。

14. 乒乓球比賽

public class Compete {

static char[] m = { 'a', 'b', 'c' };
static char[] n = { 'x', 'y', 'z' };

public static void main(String[] args) {
for (int i = 0; i < m.length; i++) {
for (int j = 0; j < n.length; j++) {
if (m[i] == 'a' && n[j] == 'x') {
continue;
} else if (m[i] == 'a' && n[j] == 'y') {
continue;
} else if ((m[i] == 'c' && n[j] == 'x')
|| (m[i] == 'c' && n[j] == 'z')) {
continue;
} else if ((m[i] == 'b' && n[j] == 'z')
|| (m[i] == 'b' && n[j] == 'y')) {
continue;
} else
System.out.println(m[i] + " vs " + n[j]);
}
}
}
}

  • 難度:????
  • 題目:兩個(gè)乒乓球隊(duì)進(jìn)行比賽,各出三人。甲隊(duì)為a,b,c三人,乙隊(duì)為x,y,z三人。已抽簽決定比賽名單。有人向隊(duì)員打聽(tīng)比賽的名單。a說(shuō)他不和x比,c說(shuō)他不和x,z比,請(qǐng)編程序找出三隊(duì)賽手的名單。

15. 求分?jǐn)?shù)之和

public class FenShu {
public static void main(String[] args) {
int x = 2, y = 1, t;
double sum = 0;

DecimalFormat df = new DecimalFormat("#0.0000");

for (int i = 1; i <= 20; i++) {
sum += (double) x / y;
t = y;
y = x;
x = y + t;
System.out.println("第 " + i + " 次相加,和是 " + df.format(sum));
}
}
}

  • 難度:????
  • 題目:有一分?jǐn)?shù)序列:2/1,3/2,5/3,8/5,13/8,21/13…求出這個(gè)數(shù)列的前20項(xiàng)之和。
  • 邏輯:抓住分子與分母的變化規(guī)律。

16. 求階乘的和

public class JieCheng {
static long sum = 0;
static long fac = 0;

public static void main(String[] args) {
long sum = 0;
long fac = 1;
for (int i = 1; i <= 10; i++) {
fac = fac * i;
sum += fac;
}
System.out.println(sum);
}
}

  • 難度:???
  • 題目:求1+2!+3!+…+20!的和
  • 邏輯:把累加變成了累乘
  • 擴(kuò)展:階乘是基斯頓·卡曼(Christian Kramp,1760~1826)于 1808 年發(fā)明的運(yùn)算符號(hào),是數(shù)學(xué)術(shù)語(yǔ)。一個(gè)正整數(shù)的階乘(factorial)是所有小于及等于該數(shù)的正整數(shù)的積,并且0的階乘為1。自然數(shù)n的階乘寫作n!。1808年,基斯頓·卡曼引進(jìn)這個(gè)表示法。

17. 回文判斷

public class HuiWen {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print("請(qǐng)輸入一個(gè)正整數(shù):");
long a = s.nextLong();
String ss = Long.toString(a);
char[] ch = ss.toCharArray();
boolean is = true;
int j = ch.length;
for (int i = 0; i < j / 2; i++) {
if (ch[i] != ch[j - i - 1]) {
is = false;
}
}
if (is == true) {
System.out.println("這是一個(gè)回文數(shù)");
} else {
System.out.println("這不是一個(gè)回文數(shù)");
}
}
}
  • 難度:???
  • 題目:一個(gè)5位數(shù),判斷它是不是回文數(shù)。即12321是回文數(shù),個(gè)位與萬(wàn)位相同,十位與千位相同。

18. 按順序輸出數(shù)列

public class ShunXu {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int a = s.nextInt();
int b = s.nextInt();
int c = s.nextInt();

if (a < b) {
int t = a;
a = b;
b = t;
}

if (a < c) {
int t = a;
a = c;
c = t;
}

if (b < c) {
int t = b;
b = c;
c = t;
}

System.out.println("從大到小的順序輸出:");
System.out.println(a + " " + b + " " + c);
}
}

  • 難度:???
  • 題目:輸入3個(gè)數(shù)a,b,c,按大小順序輸出

19. 位置替換

public class TiHuan {

static final int N = 8;

public static void main(String[] args) {

int[] a = new int[N];
Scanner s = new Scanner(System.in);
int index1 = 0, index2 = 0;

System.out.println("please input numbers");
for (int i = 0; i < N; i++) {
a[i] = s.nextInt();
System.out.print(a[i] + " ");
}

int max = a[0], min = a[0];
for (int i = 0; i < a.length; i++) {
if (a[i] > max) {
max = a[i];
index1 = i;
}
if (a[i] < min) {
min = a[i];
index2 = i;
}
}

if (index1 != 0) {
int temp = a[0];
a[0] = a[index1];
a[index1] = temp;
}

if (index2 != a.length - 1) {
int temp = a[a.length - 1];
a[a.length - 1] = a[index2];
a[index2] = temp;
}
System.out.println("after swop:");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
}

  • 難度:??
  • 題目:輸入數(shù)組,最大的與第一個(gè)元素交換,最小的與最后一個(gè)元素交換,輸出數(shù)組。

20. 1的個(gè)數(shù)

long startTime = System.currentTimeMillis();
int num = 10000000, saveNum = 1, countNum = 0, lastNum = 0;
int copyNum = num;
while (num != 0) {
    lastNum = num % 10;
    num /= 10;
    if (lastNum == 0) {
        // 如果是0那么正好是少了一次所以num不加1了
        countNum += num * saveNum;
    } else if (lastNum == 1) {
        // 如果是1說(shuō)明當(dāng)前數(shù)內(nèi)少了一次所以num不加1,而且當(dāng)前1所在位置
        // 有1的個(gè)數(shù),就是去除當(dāng)前1最高位,剩下位數(shù),的個(gè)數(shù)。
        countNum += num * saveNum + copyNum % saveNum + 1;
    } else {
        // 如果非1非0.直接用公式計(jì)算
        // abcd...=(abc+1)*1+(ab+1)*10+(a+1)*100+(1)*1000...
        countNum += (num + 1) * saveNum;
    }
    saveNum *= 10;
}
System.out.println("1的個(gè)數(shù):" + countNum);
System.out.println("計(jì)算耗時(shí):" + (System.currentTimeMillis() - startTime) + "毫秒");
  • 難度:????
  • 題目:1n中,1出現(xiàn)的次數(shù)。比如:110,1出現(xiàn)了兩次。
  • 邏輯:我們能發(fā)現(xiàn)這個(gè)1的個(gè)數(shù)在100、1000、10000中是有規(guī)則的循環(huán)出現(xiàn)的。11、12、13、14或者21、31、41、51,以及單個(gè)的1出現(xiàn)。最終可以得出通用公式:abcd…=(abc+1)*1+(ab+1)*10+(a+1)*100+(1)*1000…,abcd代表位數(shù)。另外在實(shí)現(xiàn)的過(guò)程還需要考慮比如不足100等情況,例如98、1232等。

三、深度擴(kuò)展

Java 代碼本身就是基于數(shù)據(jù)結(jié)構(gòu)和算法對(duì)數(shù)學(xué)邏輯的具體實(shí)現(xiàn),而那些隱含在代碼中的數(shù)學(xué)知識(shí)如果你不會(huì),那么壓根你就會(huì)忽略掉它,也就因此看不懂源碼了。

就像我問(wèn)你:

  • HashCode為什么用31作為乘數(shù),你證明過(guò)嗎?
  • 擾動(dòng)函數(shù)的函數(shù)作用是什么,它還有什么場(chǎng)景在用?
  • 拉鏈尋址和開(kāi)放尋址具體是什么表現(xiàn),怎么解決的碰撞問(wèn)題?
  • ThreadLocal 的實(shí)現(xiàn)中還有黃金分割點(diǎn)的使用,你知道嗎?
  • CLH、MCS,都是怎么實(shí)現(xiàn)的公平鎖,代碼是什么樣?
  • jvmti 可以用于非入侵的監(jiān)控線程池狀態(tài),你用過(guò)嗎?

所以小傅哥整理了一本,《Java 面經(jīng)手冊(cè)》 是一本以面試題為入口講解 Java 核心技術(shù)的 PDF 書籍,書中內(nèi)容也極力的向你證實(shí)代碼是對(duì)數(shù)學(xué)邏輯的具體實(shí)現(xiàn)。為什么這么說(shuō)? 當(dāng)你仔細(xì)閱讀書籍時(shí),會(huì)發(fā)現(xiàn)這里有很多數(shù)學(xué)知識(shí),包括:擾動(dòng)函數(shù)、負(fù)載因子、拉鏈尋址、開(kāi)放尋址、斐波那契(Fibonacci)散列法還有黃金分割點(diǎn)的使用等等。

Java 面經(jīng)手冊(cè),資料下載:https://codechina.csdn.net/MiddlewareDesign/doc/-/issues/8

四、總結(jié)

  • Programming is one of the most difficult branches of applied mathematics; the poorer mathematicians had better remain pure mathematicians. https://www.cs./users/EWD/transcriptions/EWD04xx/EWD498.html
  • 單純的只會(huì)數(shù)學(xué)寫不了代碼,能寫代碼的不懂?dāng)?shù)學(xué)只能是CRUD碼農(nóng)。數(shù)學(xué)知識(shí)幫助你設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)和實(shí)現(xiàn)算法邏輯,代碼能力幫你駕馭設(shè)計(jì)模式和架構(gòu)模型。多方面的知識(shí)結(jié)合和使用才是碼農(nóng)和工程師的主要區(qū)別,也是是否擁有核心競(jìng)爭(zhēng)力的關(guān)鍵點(diǎn)。
  • 學(xué)習(xí)知識(shí)有時(shí)候看不到前面的路有多遠(yuǎn),但哪怕是個(gè)泥坑,只要你不停的蠕動(dòng)、折騰、翻滾,也能抓出一條泥鰍。知識(shí)的路上是發(fā)現(xiàn)知識(shí)的快樂(lè),還學(xué)會(huì)知識(shí)的成就感,不斷的促使你前行。

五、系列推薦

  • 大學(xué)四年到畢業(yè)工作5年的學(xué)習(xí)路線資源匯總
  • 工作兩年簡(jiǎn)歷寫成這樣,誰(shuí)要你呀!
  • 工作3年,看啥資料能月薪30K?
  • 程序員出一本技術(shù)書,是什么 體驗(yàn)?
  • 小伙伴美團(tuán)一面的分享和分析(含解答)

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多