最近在回顧之前使用C寫過的數據結構和算法的東西,發現本身的算法和數據結構是真的薄弱,如今用Java改寫一下,重溫一下。java
只能說慢慢積累吧~下面的題目難度都是簡單的,算法的大佬可直接忽略這篇文章了~入門或者算法薄弱的同窗可參考一下~程序員
不少與排序相關的小算法(合併數組、獲取數字每位值的和),我都沒有寫下來了,由於只要會了歸併排序(合併數組),會了桶排序(獲取數字每位的值),這些都不成問題了。若是還不太熟悉八大基礎排序的同窗可看:【八大基礎排序總結】算法
因爲篇幅問題,每篇寫十道吧~數組
若是有錯的地方,或者有更好的實現,更恰當的理解方式但願你們不吝在評論區留言哦~你們多多交流微信
1-n
階乘之和1-n階乘之和怎麼算?數據結構
1
1*2
1*2*3
1*2*3*4
如今咱們要求這些階乘的和。思路:數據結構和算法
/** * 1-n的階乘之和 */
public static void Factorial(int n) {
//總和
double sum = 0;
//階乘值,初始化爲1
double factorial = 1;
for (int i = 1; i <= n; i++) {
factorial = factorial * i;
sum = (int) (sum + factorial);
}
System.out.println("公衆號:Java3y" + " " + sum);
}
複製代碼
獲取二維數組每列最小的值spa
思路:遍歷列,再遍歷列中行3d
咱們通常操做數組都是從行開始,再到列的。此次要求的是每列的最小值,所以須要在內部for循環遍歷的是行code
/** * 求出二維數組每列的最小值 */
public static void minArray() {
//二維數組
int[][] arrays = {
{23, 106, 8, 234},
{25, 9, 73, 19},
{56, 25, 67, 137}
};
//獲取列數
int maxColLength = arrays[0].length;
//使用一個數組來裝載每列最小的值
int[] minArray = new int[maxColLength];
//控制列數
for (int i = 0; i < maxColLength; i++) {
//假設每列的第一個元素是最小的
int min = arrays[0][i];
//控制行數
for (int j = 1; j < arrays.length; j++) {
//找到最小值
if (arrays[j][i] < min) {
min = arrays[j][i];
}
}
//賦值給裝載每列最小的值的數組
minArray[i] = min;
}
System.out.println("公衆號:Java3y" + " " + minArray);
}
複製代碼
求"1!+4!(2的平方)+9!(3的平方)的值
思路:先求平方,後求階乘,最後相加便可~
/** * 求"1!+4!(2的平方)+9!(3的平方)+...+n的值 */
public static void calculate() {
double sum = 0;
for (int i = 1; i <= 3; i++) {
//獲得平方數
int square = i * i;
//階乘值,從1開始
double factorial = 1;
//求階乘
for (int j = 1; j <= square; j++) {
factorial = factorial * j;
}
sum = sum + factorial;
}
System.out.println("公衆號:Java3y" + " " + sum);
}
複製代碼
數組對角線元素之和
思路:
/** * 數組對角線之和 */
public static void arraySum() {
int[][] arrays = {
{23, 106, 8, 234},
{25, 9, 73, 19},
{56, 25, 67, 137},
{33, 22, 11, 44},
};
//和
int sum = 0;
for (int i = 0; i < arrays.length; i++) {
for (int j = 0; j < arrays[i].length; j++) {
if (i == j) {
sum = sum + arrays[i][j];
}
}
}
System.out.println("公衆號:Java3y" + sum);
}
複製代碼
楊輝三角形
楊輝三角形長的是這個樣子:
ps:圖片來源網上,侵刪~
規律:
代碼實現:
/** * 打印楊輝三角形 */
public static void PascalTriangle() {
//打印十行的楊輝三角形
int[][] arrays = new int[10][];
//行數
for (int i = 0; i < arrays.length; i++) {
//初始化第二層的大小
arrays[i] = new int[i + 1];
//列數
for (int j = 0; j <= i; j++) {
//是第一列,第一行,行數等於列數,那麼統統爲1
if (i == 0 || j == 0 || j == i) {
arrays[i][j] = 1;
} else {
//當前值等於頭上的值+頭上左邊的值
arrays[i][j] = arrays[i - 1][j] + arrays[i - 1][j - 1];
}
}
}
System.out.println("公衆號:Java3y" + "-------------------------------");
for (int[] array : arrays) {
for (int value : array) {
System.out.print(value + "\t");
}
System.out.println();
}
System.out.println("公衆號:Java3y" + "-------------------------------");
}
複製代碼
結果:
猴子摘下了n個桃子,當天吃掉一半多一個,次日也是吃掉剩下桃子的一半多一個,到了第十天,桃子只剩下了1個。問:猴子第一天摘了多少個桃子
思路:
f(n - 1) = f(n)/2 - 1
,f(n) = 2 * f(n - 1) + 2
用遞歸和循環均可解決:
遞歸方式:
/** * 猴子吃桃問題 * @param x 天數 */
public static int monkeyQue(int x) {
if (x <= 0) {
return 0;
} else if (x == 1) {
return 1;
} else {
return 2 * monkeyQue(x - 1) + 2;
}
}
複製代碼
循環方式:
int x = 1;
for (int i = 1; i <= 9; i++) {
x = (x + 1) * 2;
}
複製代碼
結果:
輸入一段字符,計算出裏面單詞的個數,單詞之間用空格隔開 ,一個空格隔開,就表明着一個單詞了
思路:
/** * 輸入一段字符,計算出裏面單詞的個數 * * @param str 一段文字 */
public static int countWord(String str) {
// 0 表示空格狀態,1 表示非空格狀態
int flag = 0;
// 單詞次數
int num = 0;
for (int i = 0; i < str.length(); i++) {
if (String.valueOf(str.charAt(i)).equals(" ") ) {
flag = 0;
} else if (flag == 0) {
num++;
flag = 1;
}
}
return num ;
}
複製代碼
結果:
給定兩個字符串s和t,判斷這兩個字符串中的字母是否是徹底同樣(順序能夠不同)
思路:
'a'
,將其分別存入到數組中去,隨後看這兩個數組是否相等便可要點:
'c'-'a'=2
便可計算出存儲的位置,若是有多個,則+1便可,後面咱們來比較數組大小代碼實現:
/** * 給定兩個字符串s和t,判斷這兩個字符串中的字母是否是徹底同樣(順序能夠不同) */
public static void isAnagram() {
//分別存儲字符串的字符
char[] array1 = new char[26];
char[] array2 = new char[26];
String s1 = "pleasefollowthewechatpublicnumber";
String s2 = "pleowcnumberthewechatpubliasefoll";
for (int i = 0; i < s1.length(); i++) {
char value = s1.charAt(i);
// 算出要存儲的位置
int index = value - 'a';
array1[index]++;
}
for (int i = 0; i < s2.length(); i++) {
char value = s2.charAt(i);
// 算出要存儲的位置
int index = value - 'a';
array2[index]++;
}
for (int i = 0; i < 26; i++) {
if (array1[i] != array2[i]) {
System.out.println("不相同");
return;
}
}
System.out.println("相同");
}
複製代碼
結果:
判斷一個數是否是2的某次方
思路:
/** * 判斷是不是2的某次方 */
public static void isPowerOfTwo() {
int num = 3;
if (num == 0) {
System.out.println("不是");
}
while (num % 2 == 0) {
num = num / 2;
}
if (num == 1) {
System.out.println("是");
} else {
System.out.println("不是");
}
}
複製代碼
結果:
這題還有另外一種解決方式,就是位運算:
if(num <= 0){
System.out.println("不是");
}
else if(num == 1){
System.out.println("是");
}
else{
if( (num & (num-1) ) == 0){
System.out.println("是");
}
else{
System.out.println("不是");
}
}
複製代碼
判斷一個數字是否是ugly number(分解出來的質因數只有二、三、5這3個數字)
思路:
代碼:
/** * 判斷一個數字是否是ugly number(分解出來的質因數只有二、三、5這3個數字) * @param num */
public static void isUgly(int num) {
if (num <= 0) {
System.out.println("不是");
} else {
while (num % 2 == 0) {
num = num / 2;
}
while (num % 3 == 0) {
num = num / 3;
}
while (num % 5 == 0) {
num = num / 5;
}
if (num == 1) {
System.out.println("是");
} else {
System.out.println("是");
}
}
}
複製代碼
結果:
沒錯,你沒看錯,簡單的小算法也要總結!
其實我以爲這些比較簡單的算法是有"套路"可言的,你若是知道它的套路,你就很容易想得出來,若是你不知道它的套路,那麼極可能就不會作了(沒思路)。
積累了必定的"套路"之後,咱們就能夠根據經驗來推斷,揣摩算法題怎麼作了。
舉個很簡單的例子:
9*9
乘法表誰沒背過?好比看到2+2+2+2+2
,會了乘法(套路)之後,誰還會慢慢加上去。看見了5個2,就直接得出2*5
了1-n
階乘之和
1*2*3*4*...n
,實際上就是一個循環的過程,求和就套個sum變量便可!'c-a'
就是字母c
在數組的位置了(也就是2)。因爲字母出現的次數不惟一,所以咱們比較的是數組的值(若是出現了兩次,那麼值爲2,若是出現了3次,那麼值爲3)。只要用於裝載兩個數組的值都吻合,那麼字母就是同樣!&
運算,那麼確定爲0。用這個特性就很是好判斷該數是不是2的某次方了number % 2 == 0
就能夠縮小,每次number / 2
),最後的商必然是1。number%2||%3||%5==0
,每次number / 2 | / 3 /5
),最後的商必然是1。若是文章有錯的地方歡迎指正,你們互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同窗,能夠關注微信公衆號:Java3y