【算法刷题日记之本手篇】小易的升级之路与找出字符串中第一个只出现一次的字符

举报
未见花闻 发表于 2022/08/31 21:41:39 2022/08/31
【摘要】 本篇文章介绍来自牛客试题广场的两道题题解,分别为【小易的升级之路】和【找出字符串中第一个只出现一次的字符】,展示语言java。

⭐️前面的话⭐️

本篇文章介绍来自牛客试题广场的两道题题解,分别为【小易的升级之路】和【找出字符串中第一个只出现一次的字符】,展示语言java。

📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创!
📆首发时间:🌴2022年8月31日🌴
✉️坚持和努力一定能换来诗与远方!
💭参考书籍:📚《算法》,📚《算法导论》
💬参考在线编程网站:🌐牛客网🌐力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!

⭐️小易的升级之路⭐️

🔐题目详情

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

题目来源:牛客网,注册才能刷题哦!
题目链接:小易的升级之路

💡解题思路

基本思路: 模拟题
解题思路:

本道题为模拟题,根据题意,初始能力值为a,不妨设实时的能力值为ans,题目给了我们n只怪物的防御力,不妨记怪物的防御力为curDen

主要有以下的几种情况:

  • a n s > = c u r D e n ans>=curDen , 实时能力值加上curDen
  • a n s < c u r D e n ans<curDen ,实时能力值加上anscurDen的最大公约数。

最大公约数的求法可以使用辗转相除法,这里就不多赘述了,该专栏前面的文章有介绍如何求解最大公约数。

经历n只怪物洗礼后,最终ans就是小易的最终能力值。

🔑源代码

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        while (sc.hasNext()) {
            int n = sc.nextInt();
            int a = sc.nextInt();
        
            int ans = a;
        
            for (int i = 0; i < n; i++) {
                int curDen = sc.nextInt();
                if (ans >= curDen) {
                    ans += curDen;
                } else {
                    ans += maxDiv(curDen, ans);
                }
            }
            System.out.println(ans);
        }
        
    }
    //求两数最大公约数
    private static int maxDiv(int a, int b) {
        while (b > 0) {
            int tmp = b;
            b = a % b;
            a = tmp;
        }
        return a;
    }
}

🌱总结

本题为简单模拟题,按照题目意思模拟即可。

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

🔐题目详情

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

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

输入描述:

输入一个非空字符串

输出描述:

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

示例1

输入:

asdfasdfo

输出:

o

题目来源:牛客网,注册才能刷题哦!
题目链接:找出字符串中第一个只出现一次的字符

💡解题思路

基本思路: 哈希表

解题思路:
使用哈希表记录每个字母出现的次数,统计完成后,再遍历字符获取字符出现的频率,如果发现频率为1则输出,如果字符串遍历完还没有频率为1的字符,输出-1

🔑源代码

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        //哈希表
        Map<Character, Integer> hash = new HashMap<>();
        char[] cs = str.toCharArray();
        for (char c : cs) {
            hash.put(c, hash.getOrDefault(c, 0) + 1);
        }
        for (char c : cs) {
            if (hash.get(c) == 1) {
                System.out.println(c);
                return;
            }
        }
        System.out.println(-1);
    }
}

🌱总结

本题为哈希表简单应用题,使用哈希表计数判断第一个频率为1的字符并输出即可。
类似题:
剑指 Offer II 004. 只出现一次的数字

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。