要找出第一次,只出现一次的字符
思路:我们先去找出只出现一次的所有字符,然后再想办法找出第一个出现的字符
我们要统计每个字符出现的次数对吧?那我们就要对应的使用 Map 来统计次数,我们用 HashMap
我们搞一个Map来统计,遍历字符串,如果发现Map不存在这个字符,就是第一次出现,如果遍历的字符,出现大于1,就把它当前的次数记录下来,然后再加上1(次数)
遍历完整个字符串后就已经统计好了所有字符的出现的次数~
接着就要找第一次出现的数量为1的字符
这就要再继续遍历整个字符串,每遍历一个字符,看这个字符在Map的value值,如果第一次遍历到value值是1的字符就直接打印出来,就不用再往下遍历了,此时打印的这个字符是满足条件的~
import java.util.Scanner;
import java.util.HashMap;
import java.util.Map;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str = in.nextLine();
Map<Character,Integer> map = new HashMap<>();
for(int i = 0; i < str.length(); i++){
if(map.get(str.charAt(i)) == null){
map.put(str.charAt(i), 1);
}else{
int value = map.get(str.charAt(i));
map.put(str.charAt(i), value + 1);
}
}
for(int i = 0; i < str.length(); i++){
if(map.get(str.charAt(i)) == 1){
System.out.println(str.charAt(i));
return;
}
}
System.out.println(-1);
}
}
这题的关键就是要求出两个整数的最大公约数~
它说小易有一个初始能力值,然后有n个怪物,每打一个怪物就会在a的基础上给小易添加经验,
小易的能力大于怪物防御力,可以轻松打死怪物,获取的经验是 怪物的 防御力 bi
如果小易的能力此时小于等于怪物防御力,打死怪物得到的经验是 此时小易的能力 和 这个怪物防御力 bi 的最大公约数
所以我们要写一个求两个数最大公约数的方法
注意:多组输入(while)
求两个整数的最大公约数请跳转到上一篇博客~
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
while(in.hasNextInt()){
int n = in.nextInt();
int a = in.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; i++){
arr[i] = in.nextInt();
}
for(int i = 0; i < n; i++){
if(a > arr[i]){
a += arr[i];
}else if(a <= arr[i]){
a += gcd(a,arr[i]);
}
}
System.out.println(a);
}
}
//辗转相除法求约数
public static int gcd(int m, int n){
if(m < n){
int tmp = m;
m = n;
n = tmp;
}
while(n != 0){
int ret = m % n;
m = n;
n = ret;
}
return m;
}
}