[天梯赛] 零基础刷题(天梯赛备赛热身赛)(Java题解)
问题 A: 海底沉船
题目描述
X星人在一艘海底沉船上发现了很多很多很多金币,可爱的X星人决定用这些金币来玩一个填格子的游戏。
其规则如下:第1个格子放2枚金币,第2个格子放6枚金币,第3个格子放12枚金币,第4个格子放20枚金币,第5个格子放30枚金币,以此类推。
请问放到第n个格子时一共放了多少枚金币?
输入
多组输入。每组一个正整数n,表示最后一个格子的编号。(n<=100)
输出
对于每一组输入,输出从第1个格子到第n个格子的总金币数。
样例输入
1
3
样例输出
2
20
这个可以很快的找到一个规律啊,发现这是一个等差数列
Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
int ans = 0;
Scanner scanner=new Scanner(System.in);
while(scanner.hasNextInt()) {
int k=scanner.nextInt();
ans=0;
for(int i=1;i<=k;i++) {
ans+=2*(1+i)*i/2;
}
System.out.println(ans);
}
scanner.close();
}
}
问题 B: 粗心的小表弟
题目描述
今天英语课,小表弟的英语老师教了他三个与动物有关的单词,分别是cat、pig和horse,但是粗心的小表弟在写这三个单词的时候经常会写错。
假如小表弟每个单词最多写错一个字母(当然有时候也是会全部写对的,且字母个数是完全正确的)。
你能否编写一个程序,对小表弟写的单词进行自动纠错。
输入
单组输入。
输入一个可能存在单个字母错误的单词。
输出
输出与输入对应的正确单词。
样例输入
hoose
样例输出
horse
有时候为了使代码更简洁很习惯把问题复杂化,其实多用几个判断条件就能区分‘cat’和’pig’了
Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
String string;
Scanner scanner=new Scanner(System.in);
string=scanner.nextLine();
if(string.length()==5) {
System.out.println("horse");
}else {
if((string.charAt(0)!='c'&&string.charAt(1)=='a'&&string.charAt(2)=='t')||
(string.charAt(0)=='c'&&string.charAt(1)!='a'&&string.charAt(2)=='t')||
(string.charAt(0)=='c'&&string.charAt(1)=='a'&&string.charAt(2)!='t')||
(string.charAt(0)=='c'&&string.charAt(1)=='a'&&string.charAt(2)=='t')){
System.out.println("cat");
}else {
System.out.println("pig");
}
}
scanner.close();
}
}
问题 C: 十六进制
题目描述
小米同学最近在学习进制转换。众所周知,在表示十六进制数时,除了0-9这九个阿拉伯数字外,还引入了“A”、“B”、“C”、“D”、“E”和“F”这六个英文字母(不区分大小写)。
现在给你一个十进制正整数,请问在将其转换为十六进制之后,对应的十六进制表示中有多少位是字母?
输入
单组输入。
输入一个十进制正整数N(N<=10^6)。
输出
输出将N转换成十六进制数字后所包含的字母位的数量,如果没有字母位则输出0。
样例输入
20
样例输出
0
对数制转换熟悉就很easy了,除此之外Java自身还有数制转换的方法
Java
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
// TODO Auto-generated method stub
int n,ans=0;
Scanner scanner=new Scanner(System.in);
n=scanner.nextInt();
while(n!=0) {
if(n%16>=10) {
ans++;
}
n=n/16;
}
System.out.println(ans);
scanner.close();
}
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int n,ans=0;
Scanner scanner=new Scanner(System.in);
n=scanner.nextInt();
String string=Integer.toHexString(n);
//System.out.println(string);
for(int i=0;i<string.length();i++) {
if(!(string.charAt(i)>='0'&&string.charAt(i)<='9')) {
ans++;
}
}
System.out.println(ans);
scanner.close();
}
}
问题 D: 平行四边形
题目描述
Kimi想用“”号构成一个平行四边形并在屏幕上输出。
当输入一个大于等于2的正整数N时,屏幕上将显示一个由NN个“*”组成的平行四边形。
例如:输入3,输出如下平行四边形。
***
***
***
输入
输入一个正整数N,1<N<=100。
输出
输出一个N行,每行N个“*”组成的平行四边形。
样例输入
3
样例输出
***
***
***
Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int n;
Scanner scanner=new Scanner(System.in);
n=scanner.nextInt();
for(int i=n;i>0;i--) {
for(int j=i-1;j>0;j--) {
System.out.print(" ");
}
for(int k=0;k<n;k++) {
System.out.print("*");
}
System.out.println();
}
scanner.close();
}
}
问题 E: 临时换人
题目描述
因为某些原因,Jack和Rose没有办法参加毕业演出,他们两个的工作任务都将由劳模Tom来代替。
现在需要更新演职人员名单,将所有的Jack和Rose替换成Tom。
请你编写一段程序实现人员替换功能。
输入
单组输入。
输入一个字符串(可能有空格,字符串长度<=1e5),包含若干Jack和Rose。
输出
输出替换之后的字符串。
样例输入
Cameraman: Jack, Lighting engineer: Rose.
样例输出
Cameraman: Tom, Lighting engineer: Tom.
呵呵,这一题我又知道一个Java自带的方法,两行解决了
Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
String s;
Scanner scanner=new Scanner(System.in);
s=scanner.nextLine();
s=s.replaceAll("Jack", "Tom");
s=s.replaceAll("Rose", "Tom");
System.out.println(s);
scanner.close();
}
}
问题 F: 第n个数
题目描述
自从学了素数以后,明明喜欢上了数字2、3和5。当然,如果一个数字里面只出现2、3和5这三个数字,他也一样喜欢,例如222、2355、223355。
现在他希望你能够帮他编写一个程序,快速计算出由2、3、5这三个数字组成的由小到大的第n个数,当然也包括2、3和5。
输入
每组输入数据占1行,每行输入一个正整数n。(n<=1000)
输出
每组输出数据占1行,即满足要求的第n个数。
样例输入
3
样例输出
5
这道题死磕了我好久,虽然在网上看到了一些别的解法,但还是坚持捣鼓出了自己的写法,可能有bug和不足
按照题意列出来几个就会发现这道题肯定是存在规律 的,所以我就穷思花了好一会找到了这么一列式子,
个位很好找,当n%3,余1各位上就是2,余2个位上就是3,整除也就是余0个位就是5,所以这也是为什么num[]={5,2,3},
而不是num[]={2,3,5}
然后十位上,2,3,5分别会连续3个的出现,如22,23,25;32,33,35;52,53,55;所以考虑要除3再取余,但是这时候我们会验算发现第六位数的十位是2,但是6/3%3=2,也就是会等于num[2]=3
,所以我们偏移一位得到(n-1)/3%3
依次类推,我们就发现了规律
但是怎么判断循环结束呢,从之前的验算中就能发现,如果(n-ans)<Math.pow(3, i)
那么(n-ans)/Math.pow(3, i)=0
,这时((n-ans)/(int)(Math.pow(3, i))%3)
的值会一直是0,不再有意义,所以结束循环的条件就是(n-ans)>=Math.pow(3, i)
可惜的是自己早就思路混乱了,写代码的时候好多细节没注意,导致修改了好久
过几天我可能还会去学习网上的其他解法,再整理一遍单独发出来
Java
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
int n,ans=0,leix=1;
int num[]= {5,2,3};//储存5,2,3
int solut[]= new int[10];//储存答案
Scanner scanner =new Scanner(System.in);
n=scanner.nextInt();
int index=0;//下标从0开始
solut[index]=num[n%3];//获取个位的数字
index++;
leix=(int) Math.pow(3, 0);
ans+=leix;
for(int i=1;(n-ans)>=Math.pow(3, i);i++) {
int sum= ((n-ans)/(int)(Math.pow(3, i))%3);
leix=(int) Math.pow(3, i);
ans+=leix;
solut[index]=num[sum];
index++;
}
for(int i=index-1;i>=0;i--) {
System.out.print(solut[i]);
}
System.out.println();
scanner.close();
}
}