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

发布于:2023-01-11 ⋅ 阅读:(199) ⋅ 点赞:(0)

⭐️前面的话⭐️

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

小贴士:本专栏所有题目来自牛客->面试刷题必用工具

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



注意事项:本专栏所有题目都来自牛客网,如果有小伙伴还没有注册牛客,可以点击下方链接进行注册,注册完就能立即刷题了。不仅是刷题,上面还有很多有关就业的面经,面试题库,以及名企的模拟面试,我非常推荐它,博主自己用的也很多,也刷了不少题了!下图可以作证:
1

注册地址:牛客网

1

有关任何问题都可以与博主交流,你可以在评论区留言,也可以私信我,更可以加上博主的vx与博主一对一交流(文章最下方有)。

封面区


⭐️小易的升级之路⭐️

🔐题目详情

小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 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 ans>=curDen, 实时能力值加上curDen
  • a n s < c u r D e n ans<curDen 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. 只出现一次的数字


到文章最后,再来安利一下吧,博主也是经常使用,并且也经常在牛客上刷题,题库也非常丰富:牛客网,刷题,面试,内推都有。也欢迎与博主交流有关刷题,技术方面,以及与博主聊聊天,交个朋友也好啊,毕竟有朋自远方来!

觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!

1-99


网站公告

今日签到

点亮在社区的每一天
去签到