0
点赞
收藏
分享

微信扫一扫

[天梯赛] 零基础刷题(天梯赛备赛热身赛)(Java题解)

先峰老师 2022-02-28 阅读 66

[天梯赛] 零基础刷题(天梯赛备赛热身赛)(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时,屏幕上将显示一个由N
N个“*”组成的平行四边形。
例如:输入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();
	}

}

举报

相关推荐

0 条评论