要找出第一次,只出现一次的字符
思路:我们先去找出只出现一次的所有字符,然后再想办法找出第一个出现的字符
我们要统计每个字符出现的次数对吧?那我们就要对应的使用 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
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;
- }
- }