第一题
题目描述:
国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币。
请计算在前K天里,骑士一共获得了多少金币。
代码:
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int k=sc.nextInt();
int count=0,s=1,flag=1,i;
for(i=1;i<=k;s++,flag++) {
for(int j=1;j<=flag;j++) {
count+=s;
i++;
if(i>k) {
break;
}
}
}
System.out.println(count);
}
}
第二题
题目描述:
试计算在区间1 到n 的所有整数中,数字x(0 ≤ x ≤ 9)共出现了多少次?
例如,在1到11 中,即在1、2、3、4、5、6、7、8、9、10、11 中,数字1 出现了4 次。
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int x=sc.nextInt();
StringBuilder str=new StringBuilder();
long count=0;
for(int i=1;i<=n;i++) {
str.append(i);
}
String str2=str.toString();
char []c=str2.toCharArray();
for(int i=0;i<c.length;i++) {
if(c[i]==((char)('0'+x))) {
count++;
}
}
System.out.println(count);
}
}
注意:
- 字符串拼接的时候不要用String。
- 因为String在拼接字符串的时候一直在创建对象,大量的副本对象积累在堆内存里。
- 用String拼接字符串降低了效率,放在循环里会影响程序的性能,导致时间复杂度增高,导致超时。
- 在写算法题的时候尽量使用StringBuilder,如果在应用程序要求线程安全的情况下,则使用 StringBuffer 类。
- StringBuilder比StringBuffer的效率高,但是StringBuffer比StringBuilder的线程安全。
第三题
题目描述:
给你一个数,让他进行巴啦啦能量,沙鲁沙鲁,小魔仙大变身,如果进行变身的数不满足条件的话,就继续让他变身。。。直到满足条件为止。
巴啦啦能量,沙鲁沙鲁,小魔仙大变身:对于一个数,把他所有位上的数字进行加和,得到新的数。
如果这个数字是个位数的话,那么他就满足条件。
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
wer(n);
}
static void wer(int n) {
String str=String.valueOf(n);
char c[]=str.toCharArray();
int g=0;
for(int i=0;i<c.length;i++) {
g+=c[i]-'0';
}
if(g<10) {
System.out.println(g);
}else {
wer(g);
}
}
}
第四题
题目描述:
给定长度为n的只有小写字母的字符串s,进行m次操作,每次将[l,r]范围内所有c1字符改成c2,输出操作完的字符串
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
String str=sc.next();
char c[]=str.toCharArray();
for(int i=0;i<m;i++) {
int l=sc.nextInt();
int r=sc.nextInt();
char c1=sc.next().charAt(0);
char c2=sc.next().charAt(0);
for(int j=l-1;j<r;j++) {
if(c[j]==c1) {
c[j]=c2;
}
}
}
String s="";
for(int i=0;i<n;i++) {
s+=c[i];
}
System.out.println(s);
}
}
第五题
题目详情
栗酱一个人闲得无聊的时候总是会一个人玩一些有趣的游戏。
有一天,她在机房里看见了一张图,可能是做acm的学长留下的:
栗酱想知道每一个数字,横着竖着分别有几根火柴呢?(由于火柴商偷工减料,我们认定,只要存在棍子,它就是火柴!)
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int t=sc.nextInt();
for(int i=0;i<t;i++) {
int a=sc.nextInt();
int h=0,s=0;
int num=0;
if(a==0) {
h=2;
s=4;
}
else {
while(a!=0) {
num=a%10;
a=a/10;
switch (num){
case 0:h+=2;s+=4;break;
case 1:h+=0;s+=2;break;
case 2:h+=3;s+=2;break;
case 3:h+=3;s+=2;break;
case 4:h+=1;s+=3;break;
case 5:h+=3;s+=2;break;
case 6:h+=3;s+=3;break;
case 7:h+=1;s+=2;break;
case 8:h+=3;s+=4;break;
case 9:h+=3;s+=3;break;
}
}
}
System.out.println(h+" "+s);
}
}
}