java基础编程题day22--每日两题

目录

小易的升级之路_牛客题霸_牛客网

找出字符串中第一个只出现一次的字符_牛客题霸_牛客网


小易的升级之路_牛客题霸_牛客网

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

输出描述:

对于每组数据,输出一行.每行仅包含一个整数,表示小易的最终能力值

示例1

输入:

3 50
50 105 200
5 20
30 20 15 40 100

输出:

110
205

思路:
        
如果怪物能力小于等于小易的能力,那就直接让小易的能力加怪物能力
        如果怪物能力大于小易的能力,那就需要求怪物能力和小易能力的最大公约数,之后小易的能力加上该公约数即可。

注意点:
        1.while多组输入(一般将代码写完之后,再整体套入while(scanner.hasNextInt()))
        2.求最大公约数的方法

代码实现:

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 a = scanner.nextInt();//小易的初始能力值
            int[] arr = new int[n];//每个怪物的防御力
            //循环接收每个怪物的防御力
            for(int i = 0; i < arr.length; ++i){
                arr[i] = scanner.nextInt();
            }
            //循环打怪
            for(int num : arr){
                //怪物的防御 <= 小易的能力值
                if(num <= a){
                    a += num;
                }else{//怪物的防御>小易的能力值
                    a += fun(a,num);
                }
            }
            System.out.println(a);   
        }
    }
    //求最大公约数
    /**
    * a-->小易当前的能力值,num代表当前怪物的能力值
    */
    public static int fun(int a, int num){
        int min = a;//因为a小于num,才去判断公约数
        for(int i = a; a > 0; --i){
            if(a % i == 0 && num % i == 0){
                return i;
            }
        }
        return 1;
    }
}

找出字符串中第一个只出现一次的字符_牛客题霸_牛客网

描述

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

数据范围:输入的字符串长度满足 1 \le n \le 1000 \1≤n≤1000 

输入描述:

输入一个非空字符串

输出描述:

输出第一个只出现一次的字符,如果不存在输出-1

示例1

输入:
asdfasdfo

输出:
o

思路:
        
开辟一个int类型的数组,大小为26(a-z有26个),遍历字符串,将 字符-'a' 对应的下标进行+1,遍历结束后就能得到一个数组,该数组中存放着每一个字符出现的次数。
        接着再将字符串遍历一遍,用每一个 字符 - 'a' 去访问数组对应的下标空间内容,若为1,则证明该字符只出现一次,并且是最先出现的。

注意点:
        第一个出现一次的字符,言外之意:可能有多个出现一次的字符,但我要最先出现的字符

拓展:
        
可以看看这个题,该题是有一个数字只出现一次,求出该数字
        只出现一次的数字

代码实现:

import java.util.Scanner;
//这个题求得是:第一个出现一次的字符,言外之意:可能有多个出现一次的字符,但我要最先出现的字符
public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        int[] arr = new int[26];//a是65
        //全部存入
        for(int i = 0; i < str.length(); ++i){
            int index = str.charAt(i) - 'a';
            arr[index]++;
        }
        int ret = searchChar(str,arr);
        if(ret == -1){
            System.out.println(-1);
        }else{
            System.out.println((char)(ret + 'a'));
        }
    }
    //继续用该字符串查找
    public static int searchChar(String str, int[] arr){
        for(int i = 0; i < str.length(); ++i){
            int index = str.charAt(i) - 'a';
            if(arr[index] == 1){
                return index;
            }
        }
        return -1;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值