【算法刷题日记之本手篇】完全数计算与扑克牌大小

举报
未见花闻 发表于 2022/08/31 21:34:44 2022/08/31
【摘要】 本篇文章介绍来自牛客试题广场的两道题题解,分别为【完全数计算】和【扑克牌大小】,展示语言java。

⭐️前面的话⭐️

本篇文章介绍来自牛客试题广场的两道题题解,分别为【完全数计算】和【扑克牌大小】,展示语言java。

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

⭐️完全数计算⭐️

🔐题目详情

完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。

它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。

例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。

输入n,请输出n以内(含n)完全数的个数。

数据范围: 1 n 5 × 1 0 5 1≤n≤5×10^5

输入描述:

输入一个数字n

输出描述:

输出不超过n的完全数的个数

示例1

输入:

1000

输出:

3

题目链接:完全数计算

💡解题思路

基本思路: 判断约数+遍历

解题思路:
这道题很简单,我们只需要把比n小的约数加起来,看看是否等于n即可,判断约数可以遍历[1,n/2]直接的数,看看是否是约数,如果是就加上,遍历完,最终和等于n表示n为完全数。

要求[1,n]完全数的个数,遍历这个区间,按照上述方法判断是否是完全数即可。

🔑源代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int ans = 0;
        for (int i = 1; i <= n; i++) {
            if (check(i)) {
                ans++;
            }
        }
        System.out.println(ans);
    }
    //判断是否是完全数
    private static boolean check(int n) {
        int res = 0;
        for (int i = 1; i <= n / 2; i++) {
            if (n % i == 0) {
                res += i;
            }
        }
        return res == n;
    }
}

🌱总结

本题为简单遍历题,会使用%判断约数即可。

⭐️扑克牌大小⭐️

🔐题目详情

扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A,2各4张,小王1张,大王1张。牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):)
3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER
输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有空格,如:4 4 4 4-joker JOKER
请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERROR

基本规则:
(1)输入每手牌可能是个子,对子,顺子(连续5张),三个,炸弹(四个)和对王中的一种,不存在其他情况,由输入保证两手牌都是合法的,顺子已经从小到大排列;
(2)除了炸弹和对王可以和所有牌比较之外,其他类型的牌只能跟相同类型的存在比较关系(如,对子跟对子比较,三个跟三个比较),不考虑拆牌情况(如:将对子拆分成个子)
(3)大小规则跟大家平时了解的常见规则相同,个子,对子,三个比较牌面大小;顺子比较最小牌大小;炸弹大于前面所有的牌,炸弹之间比较牌面大小;对王是最大的牌;
(4)输入的两手牌不会出现相等的情况。

答案提示:
(1)除了炸弹和对王之外,其他必须同类型比较。
(2)输入已经保证合法性,不用检查输入是否是合法的牌。
(3)输入的顺子已经经过从小到大排序,因此不用再排序了.

数据范围:保证输入合法

输入描述:

输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有空格,如4 4 4 4-joker JOKER。

输出描述:

输出两手牌中较大的那手,不含连接符,扑克牌顺序不变,仍以空格隔开;如果不存在比较关系则输出ERROR。

示例1

输入:

4 4 4 4-joker JOKER

输出:

joker JOKER

题目链接:扑克牌大小

💡解题思路

基本思路: 字符串模拟题

解题思路:
首先将输入的字符串使用-进行分解,得到两个字符串,分别表示两手牌,然后我们在将每手牌使用空格分开,得到单牌的这个字符串数组。

然后我们设置一个权重字符串数组weight,来表示牌的大小顺序,其中10我们使用1来表示。

首先我们直接判断两幅牌是否有出现王炸,如果有直接输出joker JOKER即可。

根据题目给的规则,我们知道,每手牌可能是个子,对子,顺子(连续5张),三个,炸弹(四个)和对王中的一种,不存在其他情况,如果是同类型的两手牌,我们仅仅需要比较第一个字符即可。

我们先通过单牌字符串数组,得到牌的张数,如果数量相等则表示两手排类型相同,直接取每手牌第一个字符,再依据该字符在权重weight字符串中的位置来判断两牌大小即可(可以使用indexOf方法获取字符在weight中第一次出现的下标),下标越大表示牌越大。

如果两手牌数量不相同,则计数牌的数量是否是4,如果是4则表示两手牌中有一手炸弹,直接输出炸弹那副牌的字符串即可。

如果不是以上情况,输出ERROR

🔑源代码

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        String str = sc.nextLine();
        
        String[] ss = str.split("-");
        String weight = "34567891JQKA2";
        String str1 = ss[0];
        String str2 = ss[1];
        String[] strs1 = str1.split(" ");
        String[] strs2 = str2.split(" ");
        //如果存在王炸直接获胜
        if (str1.equals("joker JOKER") || str2.equals("joker JOKER")) {
            System.out.println("joker JOKER");
            return;
        }
        if (strs1.length == strs2.length) {
            //单子,对子,顺子,三子,四炸仅需比较一个字符大小即可
            String s1 = str1.substring(0, 1);
            String s2 = str2.substring(0, 1);
            if (weight.indexOf(s1) > weight.indexOf(s2)) {
                System.out.println(str1);
            } else {
                System.out.println(str2);
            }
        } else if (strs1.length == 4) {
            //str1为炸弹
            System.out.println(str1);
        } else if (strs2.length == 4) {
            //str2为炸弹
            System.out.println(str2);
        } else {
            System.out.println("ERROR");
        }
    }
}

🌱总结

本题为字符串模拟题,重点在于分解字符串和比较两幅牌的大小,大小比较规则题目也写的比较清楚,要细心审题,主要考察对字符串以及相关方法的使用。

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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