目录
一、小易的升级之路
题目描述:
小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为 b1,b2,b3...bn. 如果遇到的怪物防御力bi小于等于小易的当前能力值c,那么他就能轻松打败怪物,并 且使得自己的能力值增加bi;如果bi大于c,那他也能打败怪物,但 他的能力值只能增加bi 与c的最大公约数.那么问题来了,在一系列的锻炼后,小易的最终能力值为多少?
输入描述:
对于每组数据,第一行是两个整数n(1≤n<100000)表示怪物的数量和a表示小易的初始能力值. 然后输入n行,每行整数,b1,b2...bn(1≤bi≤n)表示每个怪物的防御力
输出描述:
对于每组数据,输出一行.每行仅包含一个整数,表示小易的最终能力值
示例
输入:3 50
50 105 200
5 20
30 20 15 40 100
输出:110
205
题目解析:
用一个变量start存储小易的初始能力,再用一个数组monster存储n个怪物的防御值。设置一个变量end存储小易变化后的能力,遍历数组,如果此时的能力大于怪物的防御值,直接将怪物的防御值加到小易的防御值上;如果此时的能力小于怪物的防御值,求此时两个数的最大公约数,并加至小易的防御值,最后输出最终的能力。
这里求最大公约数就是先将较大值存储在变量a中,将较小值存储在变量b中,然后利用辗转相除法,求的最大公约数。
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();
int start = scanner.nextInt();
int[] monster = new int[n];
for (int i = 0; i < n; i++) {
monster[i] = scanner.nextInt();
}
System.out.println(upGrade(monster, start));
}
}
public static int upGrade(int[] monster, int start){
int end = start;
for (int i = 0; i < monster.length; i++) {
if(end >= monster[i]){
end += monster[i];
}else{
end += maxNum(end, monster[i]);
}
}
return end;
}
public static int maxNum(int a, int b){
if(b > a){
int t = a;
a = b;
b = t;
}
int temp = 0;
while(b != 0){
temp = a % b;
a = b;
b = temp;
}
return a;
}
}
二、找出字符串中第一个只出现一次的字符
题目描述:
找出字符串中第一个只出现一次的字符
数据范围:输入的字符串长度满足1<=n<=1000
输入描述:
输入一个非空字符串
输出描述:
输出第一个只出现一次的字符,如果不存在输出-1
示例
输入:asdfasdfo
输出:o
题目解析:
这里先定义了一个状态数组arr和输入的字符串s相对应,记录其位置的字符是否出现多次的状态,首先将arr全部初始化为true,如果出现不止一次就将其位置状态变为false。
接下来就是实现对其状态进行更新的具体步骤,最直观的方式就是通过两层循环遍历,寻找字符串该位置元素在后面位置有没有出现过,如果出现过,将这两个位置的元素状态都记为false,因为已经出现了,状态已经改变,我们的目的是找到没有改变状态的(即只出现一次的元素),所以改变状态后我们可以直接退出开始下一次循环(判断下一个元素)了(如果还想优化可以在内循环前判断一下当前元素状态是否为false,如果是说明当前元素已经出现过不止一次,可以直接开始下一次外循环)。
最后就是遍历状态数组,在此之前记录一个标志值flag判断是否存在只出现一次的元素,如果标志值未改变,说明不存在,最后输出-1。遍历数组,如果出现状态为true的元素,直接输出,并且改变状态值,退出循环,因为后面可能还存在状态为true的元素,但是题目要求输出第一个只出现一次的字符,所以这里一定要退出。这里也可以不设置标志值flag,只需要在循环里找到答案后直接return 即可,如果循环结束还没有返回,说明不存在,输出-1。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
boolean[] arr = new boolean[s.length()];
for (int i = 0; i < s.length(); i++) {
arr[i] = true;
}
for (int i = 0; i < s.length() - 1; i++){
for (int j = i + 1; j < s.length(); j++) {
if(s.charAt(i) == s.charAt(j)){
arr[i] = false;
arr[j] = false;
break;
}
}
}
int flag = 0;
for (int i = 0; i < s.length(); i++) {
if(arr[i]){
flag = 1;
System.out.println(s.charAt(i));
break;
}
}
if(flag == 0){
System.out.println(-1);
}
}
}
如有建议或想法,欢迎一起讨论学习~