Java题目训练——小易的升级之路和找出字符串中第一个只出现一次的字符

目录

一、小易的升级之路

二、找出字符串中第一个只出现一次的字符


一、小易的升级之路

题目描述:

小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 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);
        }

    }
}

如有建议或想法,欢迎一起讨论学习~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值