前言
时间复杂度
数据范围反推时间复杂度
枚举
暴力枚举所有的可能,时间复杂度高
1.确定解的类型
2.常用的直接枚举法:双重for循环确定满足的区间
2.判断是否满足条件
模拟
建模(确定使用什么数据结构)
递归
方法中调用自己,必须有一个退出条件(n==1到达递归出口)
进制转换
n进制转十进制,从左往右(234)八进制转十进制:4*8^0+3*8^1+2*8^2
十进制转n进制模板
public static String f(int x,int n){
StringBuilder str=new StringBuilder();
while(x>0){
str.append(x%n);
x=x/n;
}
return str.reserve().toString();//反转字符串,因为得到的是从n^0+...+n^
}
编号325标题的统计
题目描述
凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符?
注意:标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字符数时,空格和换行符不计算在内。
输入描述
输入文件只有一行,一个字符串 s (1≤∣s∣≤5)。
输出描述
输出只有一行,包含一个整数,即作文标题的字符数(不含空格和换行符)。
输入输出样例
示例
输入
Ca 45
输出
4
代码
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
String str=scan.nextLine();
int count=0;
for(int i=0;i<str.length();i++) {
if(str.charAt(i)!=' '&&str.charAt(i)!='\t') {
count++;
}
}
System.out.println(count);
}
}
编码377计数问题
题目描述
试计算在区间 1 到 n 的所有整数中,数字 x(0≤x≤9) 共出现了多少次?
例如,在 1 到 11 中,即在 1、2、3、4、5、6、7、8、9、10、11 中,数字 1 出现了 4 次。
输入描述
输入共 1 行,包含 2 个整数 n、x,之间用一个空格隔开。
其中,1≤n≤106,0≤x≤9。
输出描述
输出共 1 行,包含一个整数,表示 x 出现的次数。
输入输出样例
示例
输入
11 1
输出
4
代码
import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
long n=scan.nextLong();
int x=scan.nextInt();
List<Long> list=new ArrayList<>();
for(long i=0;i<n;i++) {
list.add(i+1);
}
long count=0;
//System.out.println(con(n,x));
for(long i:list) {
count+=con(i,x);
}
System.out.println(count);
//System.out.println(count);
}
public static long con(long a,long b) {
long count=0;
if(a==0&&a==b) {
count+=1;
}
while(a!=0) {
if(a%10==b) {
count++;
a=a/10;
}else{
a=a/10;
continue;
}
}
return count;
}
}
编号349扫雷
题目描述
在一个 n 行 m 列的方格图上有一些位置有地雷,另外一些位置为空。
请为每个空位置标一个整数,表示周围八个相邻的方格中有多少个地雷。
输入描述
输入的第一行包含两个整数 n,m。
第 2 行到第 n+1 行每行包含 m 个整数,相邻整数之间用一个空格分隔。如果对应的整数为 0,表示这一格没有地雷。如果对应的整数为 1,表示这一格有地雷。
其中,1≤n,m≤100 分钟后还是在当天。
输出描述
输出 n 行,每行 m 个整数,相邻整数之间用空格分隔。
对于没有地雷的方格,输出这格周围的地雷数量。对于有地雷的方格,输出 9。
输入输出样例
示例 1
输入
3 4
0 1 0 0
1 0 1 0
0 0 1 0
输出
2 9 2 1
9 4 9 2
1 3 9 2
代码
package lanqiaoyun;
import java.util.*;
public class a349 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int m=scan.nextInt();
int [][]a=new int [n+2][m+2];
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
a[i][j]=scan.nextInt();
}
System.out.println(" ");
}
int [][]arr=new int[n+2][m+2];
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
if(a[i][j]==1) {
arr[i][j]=9;
}else {
arr[i][j]=a[i-1][j-1]+a[i-1][j]+a[i-1][j+1]+a[i][j-1]+a[i][j+1]+a[i+1][j-1]+a[i+1][j]+a[i+1][j+1];
}
}
System.out.println();
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println(" ");
}
}
}
编号287串的处理
题目描述
用户输入的串中只有小写字母,空格和数字,不含其它的字母或符号。每个单词间由 1 个或多个空格分隔。假设用户输入的串长度不超过 200 个字符。
输出描述
输出处理好的字符串。
输入输出样例
示例
输入
you and me what cpp2005program
输出
You And Me What Cpp_2005_program
代码
package lanqiaoyun;
import java.util.*;
public class a287 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan=new Scanner(System.in);
String str=scan.nextLine();
char []ch=str.toCharArray();//将字符串转化成字符
StringBuilder str1=new StringBuilder();
int c=str.length();
int i=0;
while(i<c) {
char x=ch[i];//
if(x>='a'&&x<='z') {
if(i==0||ch[i-1]==' ') {
x^=32;
}//将首字母转换为大写(前一个数组为空格),包括第一个(i==0)
str1.append(x);//将所有字母添加进去
i++;
}//如果是字母的情况
else if(x==' '){
str1.append(x);//第一次遇到空格添加进去
while(x==' ') i++;//后面如果还存在空格直接i++
}
else {
if(i>0&&ch[i-1]>='a'&&ch[i-1]<='z') {
str1.append('_');
}
str1.append(x);//将不是字母的x添加进去
if(i+1<c&&ch[i+1]>='a'&&ch[i+1]<='z')
str1.append('_');
i++;
}
}
System.out.println(str1);
}
}
编号斐波那契数列
题目描述
斐波那契数列的定义为F(n)=F(n-1)+F(n-2),F(1)=1,F(2)=1,请你输出数列的第n个数的对数1e9+7取模的值。
代码
package lanqiaoyun;
import java.util.*;
public class feibonaqie {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
System.out.println(F(n));
}
public static long F(int n) {
long num=0;
if(n==1||n==2) {
return 1;
}
num=F(n-1)+F(n-2);
num=(long) (num%(1e9+7));
return num;
}
}
编号760数的计算
题目描述
输入一个自然数 n (n≤1000),我们对此自然数按照如下方法进行处理:
不作任何处理;
在它的左边加上一个自然数,但该自然数不能超过原数的一半;
加上数后,继续按此规则进行处理,直到不能再加自然数为止。
问总共可以产生多少个数。
输入描述
输入一个正整数 n。
输出描述
输出一个整数,表示答案。
输入输出样例
示例 1
输入
6
输出
6
代码
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
static int ans=1;
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
//在此输入您的代码...
int n=scan.nextInt();
f(n);
System.out.println(ans);
scan.close();
}
public static void f(int n){
if(n==1){
return ;
}
for(int i=1;i<=n/2;i++) {
f(i);
ans++;
}
}
}
编号582二进制表示
题目描述
小明要用二进制来表示 11 到10000 的所有整数,要求不同的整数用不同的二进制数表示,请问,为了表示 11 到 10000 的所有整数,至少需要多少个二进制位?
代码
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
// TODO Auto-generated method stub
static long count=0;
public static void main(String[] args) {
// TODO Auto-generated method stub
f(10000);
System.out.println(count);
}
public static long f(int x) {
StringBuilder str=new StringBuilder();
while(x>0) {
str.append(x%2);
x=x/2;
}
count=str.reverse().toString().length();
return count;
}
}
编号663生日蜡烛
题目描述
某君从某年开始每年都举办一次生日 party,并且每次都要吹熄与年龄相同根数的蜡烛。
现在算起来,他一共吹熄了 236236 根蜡烛。
请问,他从多少岁开始过生日 party 的?
请输出他开始过生日party 的年龄数。
代码
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int sum=0; //第一次过生日的年龄
for(int i=1;i<100;i++) {
for(int j=i;j<100;j++) {
sum+=j;
if(sum==236) {
System.out.println(i);
break;
}
}
sum=0;
}
}
}
编码2293 0的个数
问题描述
给定一个正整数 n ,请问 n 的十进制表示中末尾总共有几个 0 ?
输入格式
输入一行包含一个正整数 n。
输出格式
输出一个整数,表示答案。
样例输入
20220000
样例输出
4
代码
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan=new Scanner(System.in);
long n=scan.nextLong();
System.out.println(f(n));
}
public static long f(long n) {
long count=0;
while(n>0) {
if((n%10)==0) {
count++;
}else {
break;
}
n=n/10;
}
return count;
}
}
编号2489进制
问题描述
请问十六进制数 2021ABCD 对应的十进制是多少?
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
代码
package lanqiaoyun;
public class a2489 {
public static void main(String args[]) {
String str="2021ABCD";
char []a=str.toCharArray();
int []c=new int[str.length()];
StringBuilder str1=new StringBuilder();
long xi=0;
for(int i=str.length()-1;i>=0;i--) {
if(a[i]>='A'&&a[i]<='F') {
c[i]=(a[i]-'A'+10)*(int) Math.pow(16, xi);
xi++;
}else{
c[i]= (a[i]-'0')*(int) Math.pow(16, xi);
xi++;
}
}
long count=0;
for(int i=0;i<str.length();i++) {
count+=c[i];
}
System.out.println(count);
}
}