【刷题宝典NO.0】

2023-11-02 09:20
文章标签 刷题 宝典 no.0

本文主要是介绍【刷题宝典NO.0】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

素数的判定

打印素数

打印水仙花数 

百钱买百坤

输出闰年

逆序打印一个整数的每一位

输出乘法口诀表 

数字9出现的次数 

二进制1的个数 

输出一个整数的偶数位和奇数位的二进制序列  

求两个整数的最大公约数 

求两个整数的最小公倍数 

小乐乐与欧几里得

小乐乐与进制转换

计算分数的值

计算求和

数列求和 

打印各种图案

打印长方形

打印距离前面有一定空隙的长方形

打印空心正方形

打印 X 图形 

打印平行四边形

打印三角形

打印菱形

打印空心菱形 

小乐乐走台阶

斐波那契数列 

递归实现n的k次方 

递归求 N 的阶乘

递归求和 

递归打印数字的每一位 

返回的数字之和 


素数的判定

题目内容:

给定一个数字,判定一个数字是否是素数

import java.util.Scanner;public class Solution {public static void main(String[] args) {//方法1:让n去试除2--->n-1
//        Scanner sc = new Scanner(System.in);
//        int n = sc.nextInt();
//        int i = 2;
//        for (; i <= n - 1; i++) {    //让n去试除2--->n-1 比如:拿7试除2,3,4,5,6,因为7不能被2--->6内的数整除,说明7是素数
//            if (n % i == 0) {
//                break;
//            }
//        }
//        if (i == n) {   //如果i增长到n了,i == n > n - 1,也可以写成i > n-1 , 说明n只能被它自己整除,即素数
//            System.out.println(n + "是素数");
//        }//方法2:让n去试除2--->n/2
//        Scanner sc = new Scanner(System.in);
//        int n = sc.nextInt();
//        int i = 2;
//        for (; i <= n / 2; i++) {   //让n去试除2--->n/2,比如:16 :1*16 2*8 4*4 总存在一个数<=2/n
//            if (n % i == 0) {
//                break;
//            }
//        }
//        if (i > n / 2) {   //如果i == (2+n)/2 > n/2 了,也可以写成i > n / 2,说明n只能被它自己整除,即素数
//            System.out.println(n + "是素数");
//        }//方法3:让n去试除2--->根号n
//        Scanner sc = new Scanner(System.in);
//        int n = sc.nextInt();
//        int i = 2;
//        for (; i <= Math.sqrt(n); i++) {   //让n去试除2--->根号n,比如: 根号n * 根号n = n 总存在一个数<=根号n
//            if (n % i == 0) {
//                break;
//            }
//        }
//        if (i > Math.sqrt(n)) {   //如果i > 根号n,说明n只能被它自己整除,即素数
//            System.out.println(n + "是素数");
//        }
//    }//方法4:同方法3一样,多引入一个开关 在这有点多此一举Scanner sc = new Scanner(System.in);int n = sc.nextInt();int flag = 1;   //引入一个开关,1是素数 0不是素数int i = 2;for (; i <= Math.sqrt(n); i++) {   //让n去试除2--->根号n,比如: 根号n * 根号n = n 总存在一个数<=根号nif (n % i == 0) {flag = 0;   //如果能被整除,说明不是素数,结束本次循环break;}}if (1 == flag) {    //说明是素数System.out.println(n + "是素数");}}
}

 52b65791589241b8ae1752571ba85823.png

打印素数

题目内容:
打印 1 - 100 之间所有的素数,并统计素数的个数

import java.util.Scanner;public class Solution {public static void main(String[] args) {//方法1:引入开关
//        Scanner sc = new Scanner(System.in);
//        int n = sc.nextInt();
//        int count = 0;
//        int j = 2;
//        for (; j <= n; j++) {
//            int flag = 1;//引入一个开关,1是素数 0不是素数
//            int i = 2;
//            for (; i <= Math.sqrt(j); i++) {//让j去试除2--->根号j,比如: 根号n * 根号n = n 总存在一个数<=根号n
//                if (j % i == 0) {//如果能被整除,说明不是素数,结束本次循环
//                    flag = 0;
//                    break;
//                }
//            }
//            if (1 == flag) {//是素数就记录个数并打印
//                count++;
//                System.out.print(j + " ");
//            }
//        }
//        System.out.print("count = " + count);//方法2:改进版,将判断素数的方法封装成函数提出去Scanner sc = new Scanner(System.in);int n = sc.nextInt();int count = 0;int i = 1;for (; i <= n; i++) {if (isPrimer(i) == 1) {count++;System.out.print(i + " ");}}System.out.print("count = " + count);}//判断是否为素数public static int isPrimer(int n) {int i = 2;for (; i <= Math.sqrt(n); i++) {   //让n去试除2--->根号n,比如: 根号n * 根号n = n 总存在一个数<=根号nif (n % i == 0) {return 0;}}return 1;}
}

756478f236494571b2916994cd1558db.png

打印水仙花数 

题目内容:

求出0~100000之间的所有“水仙花数”并输出。

“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。

public class OnlineTest {//这是一个main方法,是程序的入口:public static void main(String[] args) {int i = 0;for (i = 0; i <= 100000; i++) {// 判断i是否为自幂数// 1. 计算i的位数int n = 1; // 一个数至少是一位数int tmp = i;while ((tmp /= 10) != 0) {n++;}// 2. 得到的i的每一位,求每一位的n次方和tmp = i;//刚刚是把tmp做了处理的,现在要重新赋值一次int sum = 0;while (tmp > 0) {sum += (int) Math.pow(tmp % 10, n);tmp /= 10;}if (sum == i) {System.out.print(i + " ");}}}
}

28cc0c5544a44ea1ac31713702e29344.png

百钱买百坤

public class OnlineTest {public static void main(String[] args) {//公鸡,母鸡,小鸡三个不是必须都有int cock, hen, chick;for (cock = 1; cock <= 20; cock++) {for (hen = 1; hen <= 33; hen++) {for (chick = 3; chick <= 99; chick += 3) {if (cock * 5 + hen * 3 + chick / 3 == 100) {if (cock + hen + chick == 100) {System.out.println("公鸡:" + cock + "母鸡:" + hen + "小鸡:" + chick);}}}}}}
}
public class OnlineTest {public static void main(String[] args) {/*百钱买百鸡:公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,用100文钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱。数学:设未知数:公鸡:x只母鸡:y只小鸡:z只x+y+z=100只5x+3y+z/3=100钱麻烦方式://下面那个代码不需要判断z%3==0,是因为每次z+=3,z的增长已经是三的倍数了。for(int x=1;x<=100;x++){for(int y=1;y<=100;y++){for(int z=1;z<=100;z++){//可以修改为(int z=3;z<=100;z+=3),下面就不需要再z%3==0了。if((x+y+z==100)&&(5*x+3*y+z/3==100)&&(z%3==0)){System.out.println(x+"\t"+y+"\t"+z);}}}}*///优化:for (int x = 1; x <= 19; x++) {//100-1-3=96,96/5=19for (int y = 1; y <= 31; y++) {//100-5-1=94,94/3=31int z = 100 - x - y;if ((5 * x + 3 * y + z / 3 == 100) && (z % 3 == 0)) {System.out.println(x + "\t" + y + "\t" + z);}}}}
}

 629f258ee2974e21bed5a3597487f2f7.png

输出闰年

题目内容:
输出 1000 - 2000 之间所有的闰年 

public class OnlineTest {public static boolean isLeapYear(int year) {
//        if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) {
//            return true;
//        }else{
//            return false;
//        }return ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0));}public static void main(String[] args) {Scanner in = new Scanner(System.in);for (int year = 1000; year <= 2000; year++) {boolean flag = isLeapYear(year);if (flag == true) {System.out.println(year + "是闰年!");}}}
}

9301226d54fd49399f8e188713aad134.png

逆序打印一个整数的每一位

题目内容:
逆序打印一个整数的每一位,如:123的每一位是3,2,1

本题主要考虑,如何获取一个数字的每一位:
123 % 10 = 3
123/10=12 12%10=2
12/10=1 1%10= 1

import java.util.Scanner;
public class OnlineTest {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();while (n != 0) {System.out.print(n % 10 + " ");n /= 10;}}
}

d0fe914df6834ca58d26513ab4d3f5ca.png

输出乘法口诀表 

题目内容:
输出n*n的乘法口诀表,n由用户输入。

import java.util.Scanner;
public class OnlineTest {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();for (int i = 1; i <= n; i++) {for (int j = 1; j <= i; j++) {System.out.print(i + "*" + j + "=" + i * j + "\t");}System.out.println();}for (int i = n; i >= 1; i--) {for (int j = 1; j <= i; j++) {System.out.print(i + "*" + j + "=" + i * j + "\t");}System.out.println();}}
}

 846dc06a49ed47b989e66d6cdf8da3b5.png

数字9出现的次数 

题目内容:
编写程序数一下 1到 100 的所有整数中出现多少个数字9

public class OnlineTest {public static void main(String[] args) {int count = 0;for (int i = 1; i <= 100; i++) {if (i % 10 == 9) {//判断个位的9count++;}if (i / 10 == 9) {count++;//判断十位的9}//多少个数字出现过9,此时99算1个数字,即一共19个/*if (i % 10 == 9) {//判断个位的9count++;}else if(i / 10 == 9) {count++;//判断十位的9}*/}System.out.println(count);}
}

a4263a2f356d42ccb0e63a0b9ae20954.png

二进制1的个数 

题目内容:
求一个整数,在内存当中存储时,二进制1的个数。

import java.util.Scanner;
public class OnlineTest {//方法1:/*public static int numberOf1(int n) {int count = 0;for (int i = 0; i < 32; i++) { //n可以在2进制中表示32位,每次让n无符号向右移动一位,每一位和1相与if (((n >>> i) & 1) == 1) {count++;}}return count;}*///方法2:/*public static int numberOf1(int n) {int count = 0;*//*for (int i = 0; i < 32; i++) {if ((n & 1) == 1) {count++;}n >>>= 1;}*//*while (n != 0) {if ((n & 1) != 0) {count++;}n >>>= 1;}return count;}*///方法3:n & (n - 1) 每次消去一个1,记录消去1的次数,直到1全部被消去变为0为止public static int numberOf1(int n) {int count = 0;while (n != 0) {n = n & (n - 1);    //n &= n - 1;count++;}return count;}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int ret = numberOf1(n);System.out.println(ret);}
}

8e2417259b49497ea3a7bfb90c54a33c.png

717701d90235413194b44688c895eb5c.png

输出一个整数的偶数位和奇数位的二进制序列  

import java.util.Scanner;
public class OnlineTest {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();//偶数位 下标从1开始(第二个数),每次让n右移2位让偶数位 和 1做 & 运算,如果结果是1说明当前偶数位是1,同理结果是0。。。for (int i = 31; i >= 1 ; i-=2) {System.out.print(((n >> i) & 1)+" ");}System.out.println();//奇数位 下标从0开始(第一个数),每次让n右移2位让奇数位 和 1做 & 运算,如果结果是1说明当前奇数位是1,同理结果是0。。。for (int i = 30; i >= 0 ; i-=2) {System.out.print(((n >> i) & 1)+" ");}}
}

bffc70fa3f804d30b27db333c7ec0bd2.png

a6123d50e1ba40e98942e616cb5ff778.png

 0a4b37185d3248e6b4c52eccae4d58f8.png 

求两个整数的最大公约数 

题目内容:
给定两个数,求这两个数的最大公约数

例如:

输入:20 40

输出:20

import java.util.Scanner;
public class OnlineTest {public static void main(String[] args) {//方法1:找出m和n之间的最小值min,用m和n同时对min整除,如果同时被整除,那么这个min就是最大公约数,如果不能整除,那么就min--/*Scanner in = new Scanner(System.in);int m = in.nextInt();int n = in.nextInt();int min = m > n ? n : m;while (true) {if (m % min == 0 && n % min == 0) {System.out.println("最大公约数:" + min);break;}min--;}*///方法2:辗转相除法 m % n = r ,如果r != 0,m = n,n = r,当r = 0时,n为最大公约数// 例如:m:24 n:18 第一次:m % n = 24 % 18 = 6 第二次:18 % 6 = 0,6为最大公约数Scanner in = new Scanner(System.in);int m = in.nextInt();int n = in.nextInt();/*int r = m % n;while (r != 0) {m = n;n = r;r = m % n;}*/int r = 0;while ((r = m % n) != 0) {m = n;n = r;}System.out.println("最大公约数:" + n);}
}

a5d4f89bda664e68975f44837ba12031.png

求两个整数的最小公倍数 

题目内容:
给定两个数,求这两个数的最小公倍数

例如:

输入:12 15

输出:60

import java.util.Scanner;
public class OnlineTest {public static void main(String[] args) {//找出m和n之间的最大值max,用max对m和n整除,如果同时整除了m和n,那么这个max就是最小公倍数,如果不能整除,那么就max++Scanner in = new Scanner(System.in);int m = in.nextInt();int n = in.nextInt();int max = m > n ? m : n;//或者int max = Math.max(m, n);while (true) {if (max % m == 0 && max % n == 0) {System.out.println("最小公倍数:" + max);break;}max++;}}
}

004f50e0134b429cb02de13e7528904f.png

小乐乐与欧几里得

https://www.nowcoder.com/share/jump/4389976241698855052246

描述

小乐乐最近在课上学习了如何求两个正整数的最大公约数与最小公倍数,但是他竟然不会求两个正整数的最大公约数与最小公倍数之和,请你帮助他解决这个问题。

输入描述:

每组输入包含两个正整数n和m。(1 ≤ n ≤ 109,1 ≤ m ≤ 109)

输出描述:

对于每组输入,输出一个正整数,为n和m的最大公约数与最小公倍数之和。

示例1

输入:

10 20

输出:

30

示例2

输入:

15 20

输出:

65

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);long m = scanner.nextLong();long n = scanner.nextLong();long m2 = m;long n2 = n;long r = 0;//最大公约数while ((r = m2 % n2) != 0) {m2 = n2;n2 = r;}long max = n2;//最小公倍数:m * n / 最大公约数long min = m * n / n2;System.out.println(max + min);}
}

小乐乐与进制转换

https://www.nowcoder.com/share/jump/4389976241698856221648

描述

小乐乐在课上学习了二进制八进制与十六进制后,对进制转换产生了浓厚的兴趣。因为他的幸运数字是6,所以他想知道一个数表示为六进制后的结果。请你帮助他解决这个问题。

输入描述:

输入一个正整数n  (1 ≤ n ≤ 109)

输出描述:

输出一行,为正整数n表示为六进制的结果

示例1

输入:

6

输出:

10

示例2

输入:

120

输出:

320

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int arr[] = new int[20];int i = 0;while (n > 0) {arr[i] = n % 6;n /= 6;i++;}for (--i; i >= 0; i--) {System.out.print(arr[i]);}}
}

计算分数的值

题目内容:
计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值 。

思路:
1. 从上述表达式可以分析出
   该表达式主要由100项,奇数项为正,偶数项为负
2. 设置一个循环从1~100,给出表达式中的每一项:1.0/i, 注意此处不能使用1,否则结果全部为0
  然后使用flag标记控制奇偶项,奇数项为正,偶数项为负
  然后将所有的项相加即可

public class OnlineTest {//这是一个main方法,是程序的入口:public static void main(String[] args) {double sum = 0.0;int flag = 1;for (int i = 1; i <= 100; i++) {sum += 1.0 * flag / i;flag = -flag;}System.out.println(sum);}
}

 06cd35f6bc244e1f85bef961041c995b.png

计算求和

题目内容:

求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,

例如:2+22+222+2222+22222

import java.util.Scanner;public class OnlineTest {//这是一个main方法,是程序的入口:public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int a = scanner.nextInt();int n = scanner.nextInt();int i = 0;int Sn = 0;int k = 0;for (i = 0; i < n; i++) {k = k * 10 + a;Sn += k;}System.out.println(Sn);}
}

0f16cfe1e97e447b8c0f2b6ace57fc6a.png

数列求和 

数列求和

09508f6b56e1485499d686ae7f4f3456.png

前n(n<=20)项之和。(不使用if…else等选择分支语句)
思路:
1.推导公式:

0b8b2efd1a534dbdbca5ef43d215e2cc.png

2.每次循环累加的时候符号要变换,引入一个开关,控制正负号
3.在循环里面的时候a的值每次还要减a,不然a会一直累加,a的值是相对于上个式子的b基础上+1的

import java.util.Scanner;
public class Main {//这是一个main方法,是程序的入口:public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();//b/a == b=a+b/a=b+1double b = 2; //起始分子double a = 1; //起始分母double sum = 0.0;int flag = 1;for (int i = 0; i < n; i++) {sum += 1.0 * flag * b / a; //累加b += a;  //分子a = b + 1 - a;  //分母 注意这儿每次循环要-a,因为每次循环分母a的值会累加,a的值是相对于上个式子的b基础上+1flag = -flag;}System.out.println(sum);}
}

 0310e6243f554d9b951a8699f073a588.png

打印各种图案

打印长方形

7eea04fb926e4dc7bc9f4438f270de5c.png

public class OnlineTest {public static void main(String[] args) {for (int j = 1; j <= 4; j++) {//j:控制行数//*********for (int i = 1; i <= 9; i++) {//i:控制*的个数System.out.print("*");}//换行:System.out.println();}}
}

9d9f97b6e7a34b92bd33403d2d31ae4a.png

打印距离前面有一定空隙的长方形

0979c3f91034447daa5566b06571d037.png

public class OnlineTest {public static void main(String[] args) {for (int j = 1; j <= 4; j++) {//j:控制行数//加入空格:for (int i = 1; i <= 5; i++) {//i:控制空格的个数System.out.print(" ");}//*********for (int i = 1; i <= 9; i++) {//i:控制*的个数System.out.print("*");}//换行:System.out.println();}}
}

f272f659fb394adf86e7903432717ecd.png

打印空心正方形

https://www.nowcoder.com/share/jump/1698854024034

描述

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的“空心”正方形图案。

输入描述:

多组输入,一个整数(3~20),表示输出的行数,也表示组成正方形边的“*”的数量。

输出描述:

针对每行输入,输出用“*”组成的“空心”正方形,每个“*”后面有一个空格。

示例1

输入:

4

输出:

* * * * 
*     * 
*     * 
* * * * 

示例2

输入:

5

输出:

* * * * * 
*       * 
*       * 
*       * 
* * * * * 
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while (scanner.hasNextInt()) {int n = scanner.nextInt();for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if ((i == 0) || (i == n - 1) || (j == 0) || (j == n - 1))System.out.print("* ");elseSystem.out.print("  ");}System.out.println();}}scanner.close();}
}

打印 X 图形 

https://www.nowcoder.com/practice/83d6afe3018e44539c51265165806ee4

描述

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的X形图案。

输入描述:

多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。

输出描述:

针对每行输入,输出用“*”组成的X形图案。

示例1

输入:

5

复制输出:

*     *
  * *
   * 
  * *
*    *

复制

示例2

输入:

6

复制输出:

*        *
  *    *
   * * 
   * * 
  *   *
*       *

import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextInt()) { // 注意 while 处理多个 caseint n  = in.nextInt();for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if ((i == j) || (i + j == n - 1)) {System.out.print("*");} else {System.out.print(" ");}}System.out.println();}}}
}

打印平行四边形

23ebc3d0e56548daa62babc6e7fc4cf4.png

public class OnlineTest {public static void main(String[] args) {for (int j = 1; j <= 4; j++) {//j:控制行数//加入空格:for (int i = 1; i <= (9 - j); i++) {//i:控制空格的个数System.out.print(" ");}//*********for (int i = 1; i <= 9; i++) {//i:控制*的个数System.out.print("*");}//换行:System.out.println();}}
}

94cb15a7ca944d99a3808aebad69fa47.png

打印三角形

592a97074f994b3bba39ecebab98d605.png

public class OnlineTest {public static void main(String[] args) {for (int j = 1; j <= 4; j++) {//j:控制行数//加入空格:for (int i = 1; i <= (9 - j); i++) {//i:控制空格的个数System.out.print(" ");}//*********for (int i = 1; i <= (2 * j - 1); i++) {//i:控制*的个数System.out.print("*");}//换行:System.out.println();}}
}

8ada18b9f782475c9e2dba361b1e6de1.png

打印菱形

52a15e17d15b4048b0fc7e57935fb465.png

public class OnlineTest {public static void main(String[] args) {//上面三角形:for (int j = 1; j <= 4; j++) {//j:控制行数//加入空格:for (int i = 1; i <= (9 - j); i++) {//i:控制空格的个数System.out.print(" ");}//*********for (int i = 1; i <= (2 * j - 1); i++) {//i:控制*的个数System.out.print("*");}//换行:System.out.println();}//下面三角形:for (int j = 1; j <= 3; j++) {//j:控制行数//加入空格:for (int i = 1; i <= (j + 5); i++) {//i:控制空格的个数System.out.print(" ");}//*********for (int i = 1; i <= (7 - 2 * j); i++) {//i:控制*的个数System.out.print("*");}//换行:System.out.println();}}
}

d7ca106188364222a18c9ee4cb419aa5.png

public class OnlineTest {public static void main(String[] args) {//先打印出一个正方形,然后某些位置上打印* 某些位置上打印空格:int size = 17;int startNum = size / 2 + 1;//起始列号int endNum = size / 2 + 1;//结束列号//引入一个布尔类型的变量---》理解为“开关”boolean flag = true;for (int j = 1; j <= size; j++) {//*****for (int i = 1; i <= size; i++) {if (i >= startNum && i <= endNum) {System.out.print("*");} else {System.out.print(" ");}}//换行System.out.println();if (endNum == size) {flag = false;}if (flag) {//flag是true相当于在菱形的上半侧   flag是false相当于在菱形的下半侧startNum--;endNum++;} else {startNum++;endNum--;}}}
}

 2a0701a23c70490fb05c3d158cd7e511.png

打印空心菱形 

4f18d12a936d4142a512d85051cb1990.png

public class OnlineTest {public static void main(String[] args) {//先打印出一个正方形,然后某些位置上打印* 某些位置上打印空格:int size = 17;int startNum = size / 2 + 1;//起始列号int endNum = size / 2 + 1;//结束列号//引入一个布尔类型的变量---》理解为“开关”boolean flag = true;for (int j = 1; j <= size; j++) {//*****for (int i = 1; i <= size; i++) {if (i == startNum || i == endNum) {System.out.print("*");} else {System.out.print(" ");}}//换行System.out.println();if (endNum == size) {flag = false;}if (flag) {//flag是true相当于在菱形的上半侧   flag是false相当于在菱形的下半侧startNum--;endNum++;} else {startNum++;endNum--;}}}
}

 6ad94c2db9b24410ac4fd49ce4335b9a.png

小乐乐走台阶

https://www.nowcoder.com/share/jump/4389976241698854945904

描述

小乐乐上课需要走n阶台阶,因为他腿比较长,所以每次可以选择走一阶或者走两阶,那么他一共有多少种走法?

输入描述:

输入包含一个整数n (1 ≤ n ≤ 30)

输出描述:

输出一个整数,即小乐乐可以走的方法数。

示例1

输入:

2

输出:

2

示例2

输入:

10

输出:

89

import java.util.Scanner;public class Main {public static int walk(int n) {if (n <= 2) {return n;} else {return walk(n - 1) + walk(n - 2);}}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int ret = walk(n);System.out.println(ret);scanner.close();}
}

斐波那契数列 

题目内容:
求斐波那契数列的第n项。(迭代实现)


斐波那契数列定义为:1 1 2 3 5 8 13 21 我们可以看到,从第3项开始,都等于前一项+前一项的前一项的和。
3=1+2
5+2+3
13 = 5+8
我们可以先定义f1保存第一项的值,f2保存第2项的值,f3保存第3项的值。
每次算法一个f3,就同步更新f1和f2的值。

import java.util.Scanner;
public class OnlineTest {//1.递归实现斐波那契数列public static int fib1(int n) {if (n <= 2) {return 1;} else {return fib1(n - 1) + fib1(n - 2);}}//2.       fib: 1   1   2   3   5//              a + b = c//                  a + b = c//          n: 1   2   3   4   5//                     n = 3,即n > 2时,有 c = a + b ; a = b ; b = cpublic static int fib2(int n) {int a = 1;int b = 1;int c = 0;while (n > 2) {//从第三项开始c = a + b;a = b;b = c;n--;}return c;}public static int fib3(int n) {if (n == 1 || n == 2) {return 1;}int f1 = 1;int f2 = 1;int f3 = 0;for (int i = 3; i <= n; i++) {f3 = f1 + f2;f1 = f2;f2 = f3;}return f3;}//这是一个main方法,是程序的入口:public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int ret1 = fib1(n);int ret2 = fib2(n);int ret3 = fib3(n);System.out.println("递归实现:" + ret1);System.out.println("--------------");System.out.println("非递归实现:" + ret2);System.out.println("非递归实现:" + ret3);}
}

 1e0ae15494934b65870a02b1fb9615f0.png

递归实现n的k次方 

public class OnlineTest {public static void main(String[] args) {int n = 2;int k = -1;System.out.println(power(n, k));}public static double power(int n, int k) {if (k == 0) {return 1;} else if (k > 0 ){return n * power(n, k - 1);} else {//k < 0return 1.0 / power(n, -k);}}
}

3ecf4a90f5854a188d84bc4d7310263f.png

递归求 N 的阶乘

题目内容:
递归求 N 的阶乘
递归代码重要的是推导递推公式:假设N的阶乘用F(n)表示,那么F(n) = n * F(n-1);

import java.util.Scanner;
public class OnlineTest {public static int fac(int n) {if(n < 2) {return 1;}return n * fac(n-1);}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();System.out.println(fac(n));}
}

fd01ab29ab3a4b8aaf78602d6ef67006.png

递归求和 

题目内容:
递归求 1 + 2 + 3 + ... + 10

假设用F(n) 代表1-n的和,那么F(n) = n + F(n-1)的和
F(n-1)就是1到n-1的和

import java.util.Scanner;
public class OnlineTest {public static int sum(int n) {if(n == 1) {return 1;}return n + sum(n-1);}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();System.out.println(sum(n));}
}

8406fa4b598c496eb5b440dd364b08d3.png

递归打印数字的每一位 

题目内容:
按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4) (递归)
假设用F(n) 代表 要顺序打印n的每一位,如果n是一个1位数,直接输出,如果n是2位数以上。
如:
123 相当于先打印12的每一位,再打印3
12 相当于先打印1的每一位,再打印2
1 只有一位数,直接打印。
依次回退打印完,每一位即可。

public class OnlineTest {//写法1:public static void print(int num) {if (num > 9) {print(num / 10);}System.out.println(num % 10);}//写法2:public static void fun(int n) {if (n <= 9) {System.out.println(n);return; //出口,不然会栈溢出错误(必须由程序员解决)}fun(n / 10);System.out.println(n % 10);}public static void main(String[] args) {fun(1234);System.out.println("-----");print(1234);}
}

 f71e157c2da24de09cf42e67d757479f.png

返回的数字之和 

题目内容:
写一个递归方法,输入一个非负整数,返回组成它的数字之和

要计算123的每一位,主要在于如何得到每一位。在前面的习题中我们知道,除10 , 模10.可以做到。
如下图,在执行n=123的时候,先执行add(123/10)也就是add(12)这个函数,等最后回来之后,才会把n=123时候的n%10算完。

84daa550e52f4fc0b9c0d61a3a2a2399.png

public class OnlineTest {public static int digitSum(int n) {if (n <= 9) {return n;}return n % 10 + digitSum(n / 10);}public static void main(String[] args) {System.out.println(digitSum(1729));}
}

0bc9befe1bf34666973d8fcca7902e75.png

这篇关于【刷题宝典NO.0】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/329634

相关文章

《纳瓦尔宝典》是纳瓦尔·拉维坎特(Naval Ravikant)的智慧箴言

《纳瓦尔宝典》是一本由埃里克·乔根森(Erik Jorgensen)编著的书籍,该书于2022年5月10日由中信出版社出版。这本书的核心内容围绕硅谷知名天使投资人纳瓦尔·拉维坎特(Naval Ravikant)的智慧箴言,特别是关于财富积累和幸福人生的原则与方法。 晓北斗推荐 《纳瓦尔宝典》 基本信息 书名:《纳瓦尔宝典》作者:[美] 埃里克·乔根森译者:赵灿出版时间:2022

【每日刷题】Day113

【每日刷题】Day113 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 91. 解码方法 - 力扣(LeetCode) 2. LCR 098. 不同路径 - 力扣(LeetCode) 3. 63. 不同路径 II - 力扣(LeetCode) 1. 91. 解码方法 - 力扣(LeetCode) //思路:动态规划。 cl

hot100刷题第1-9题,三个专题哈希,双指针,滑动窗口

求满足条件的子数组,一般是前缀和、滑动窗口,经常结合哈希表; 区间操作元素,一般是前缀和、差分数组 数组有序,更大概率会用到二分搜索 目前已经掌握一些基本套路,重零刷起leetcode hot 100, 套路题按套路来,非套路题适当参考gpt解法。 一、梦开始的地方, 两数之和 class Solution:#注意要返回的是数组下标def twoSum(self, nums: Lis

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II 1.题目 1.1递增子序列 题目链接:491. 非递减子序列 - 力扣(LeetCode) 视频讲解:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0491.%E9%80%92%E

kaggle竞赛宝典 | Mamba模型综述!

本文来源公众号“kaggle竞赛宝典”,仅用于学术分享,侵权删,干货满满。 原文链接:Mamba模型综述! 型语言模型(LLMs),成为深度学习的基石。尽管取得了令人瞩目的成就,Transformers仍面临固有的局限性,尤其是在推理时,由于注意力计算的平方复杂度,导致推理过程耗时较长。 最近,一种名为Mamba的新型架构应运而生,其灵感源自经典的状态空间模型,成为构建基础模型的有力替代方案

代码随想录刷题day24丨93.复原IP地址 ,78.子集 , 90.子集II

代码随想录刷题day24丨93.复原IP地址 ,78.子集 , 90.子集II 1.题目 1.1复原IP地址 题目链接:93. 复原 IP 地址 - 力扣(LeetCode) 视频讲解:回溯算法如何分割字符串并判断是合法IP?| LeetCode:93.复原IP地址_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0093.%E5%A4%8

【笔记】数据结构刷题09

快速排序 215. 数组中的第K个最大元素 class Solution {public:int findKthLargest(vector<int>& nums, int k) {return divide(nums,0,nums.size()-1,nums.size()-k);}int divide(vector<int>& nums,int left,int right,int k)

C语言:刷题日志(1)

一.阶乘计算升级版 本题要求实现一个打印非负整数阶乘的函数。 其中n是用户传入的参数,其值不超过1000。如果n是非负整数,则该函数必须在一行中打印出n!的值,否则打印“Invalid input”。 首先,知道阶乘是所有小于及等于该数的正整数的积,并且0的阶乘为1。那么我们先来个简单的阶乘计算吧。 #include<stdio.h>int Fact(int n){if (n <=

【每日刷题】Day112

【每日刷题】Day112 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 1137. 第 N 个泰波那契数 - 力扣(LeetCode) 2. 面试题 08.01. 三步问题 - 力扣(LeetCode) 3. LCR 088. 使用最小花费爬楼梯 - 力扣(LeetCode) 1. 1137. 第 N 个泰波那契数 - 力扣(LeetCo

【数据结构】【java】leetcode刷题记录--链表

简介 链表是一种常见的基础数据结构,它由一系列节点组成,每个节点包含数据域和指向下一个节点的指针。在Java中,链表通常用于实现动态数据结构,因为它可以根据需要动态地增加或减少节点。 链表简介: 节点结构:链表中的每个元素称为节点(Node),每个节点包含两部分:数据域(存储数据)和指针域(存储下一个节点的地址)动态性:链表的长度不是固定的,可以根据需要动态地增减节点。内存分配:链表中的节点