【算法刷题日记之本手篇】小易的升级之路与找出字符串中第一个只出现一次的字符
⭐️前面的话⭐️
本篇文章介绍来自牛客试题广场的两道题题解,分别为【小易的升级之路】和【找出字符串中第一个只出现一次的字符】,展示语言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
。
主要有以下的几种情况:
-
, 实时能力值加上
curDen
。 -
,实时能力值加上
ans
与curDen
的最大公约数。
最大公约数的求法可以使用辗转相除法,这里就不多赘述了,该专栏前面的文章有介绍如何求解最大公约数。
经历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. 只出现一次的数字
- 点赞
- 收藏
- 关注作者
评论(0)