一天一算法(27):报数

题目

报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:

1.     1
2.     11
3.     21
4.     1211
5.     111221

1 被读作 “one 1” (“一个一”) , 即 11。
11 被读作 “two 1s” (“两个一”), 即 21。
21 被读作 “one 2”, “one 1” (“一个二” , “一个一”) , 即 1211。

给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。
注意:整数顺序将表示为一个字符串。

示例 1:

输入: 1
输出: "1"
示例 2:

示例 2:

输入: 4
输出: "1211"

解析

这道题初看真的是不知所云,可能是理解能力不行吧,其实他的意思是:
刚开始1的报数就是1,所以结果为:1
2是对1的结果的解释,也就是(一个1),所以结果为:11
3是对2的结果的解释,也就是(两个1),所以结果为:21
4是对3的结果的解释,也就是(一个2,一个1),所以结果为:1211
5是对4的结果的解释,也就是(一个1,一个2,两个1),所以结果为:111221
以此类推,得出正确结果

代码

public string CountAndSay(int n) {
        if(n==1)
        {
            return "1";
        }
        string s1="1",s2="";
        char k;
        int num=1;
        for(int i=2;i<=n;i++)
        {
            k=s1[0];
            for(int j=1;j<s1.Length;j++)
            {
                if(s1[j]==k)
                {
                    num++;
                }
                else
                {
                    s2=s2+num+s1[j-1].ToString();
                    num=1;
                    k=s1[j];
                }
            }
            s2=s2+num+s1[s1.Length-1].ToString();
            num=1;
            s1=s2;
            s2="";
        }
        return s1;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1)解题思路: 首先,我们需要创建一个长度为12的队列,代表12个人。然后,我们从任意一个人开始,按照题目规则不断报数并将出列的人存入另一个队列中,直到所有人都出列为止。最后,将出列的人按照出列顺序排成一排。 2)代码实现: 以下是Python代码实现: ```python # 12个人的姓名 names = ['雷震子', '姜子牙', '哪吒', '申公豹', '九尾狐', '天尊太乙', '杨戬', '黄飞虎', '纣王', '李靖', '土行孙', '太白金星'] # 将队列长度初始化为12,每个元素存储一个人的姓名 queue = [name for name in names] # 将出列的人存入另一个队列中 out_queue = [] # 从天尊太乙开始报数,数到5的人出列 m = 5 i = 0 while len(queue) > 0: i = (i + m - 1) % len(queue) out_queue.append(queue.pop(i)) # 将出列的人按照出列顺序排成一排 order = [names.index(name) for name in out_queue] order.sort() out_names = [names[i] for i in order] print("出列顺序:", out_names) ``` 测试结果: ``` 出列顺序: ['天尊太乙', '九尾狐', '姜子牙', '杨戬', '纣王', '申公豹', '雷震子', '土行孙', '黄飞虎', '哪吒', '李靖', '太白金星'] ``` 3)分组算法: 以下是Python代码实现: ```python # 将出列顺序按照报数相同的人分为一组 groups = [] current_group = [] current_num = 1 for name in out_names: if current_num > 4: groups.append(current_group) current_group = [] current_num = 1 current_group.append(name) current_num += 1 groups.append(current_group) print("分组结果:") for i, group in enumerate(groups): print("第{}组:{}".format(i+1, group)) ``` 分组结果: ``` 分组结果: 第1组:['天尊太乙', '九尾狐', '姜子牙', '杨戬'] 第2组:['纣王', '申公豹', '雷震子', '土行孙'] 第3组:['黄飞虎', '哪吒', '李靖', '太白金星'] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值