报数游戏(3)--【英雄会】

回来也十天了,中间各种私事,包括替看店等等...不过现在终于有着较大段时间逛逛英雄会了,最近题目出了数道,当然难度也是比较适合的,二星、三星的我还勉强可以一做...废话不多言,说题目吧:

一种报数游戏是从1开始连续报数,如果报到7的倍数(7,14,21,28……)或者包含数字7的数(7,17,27,37……)就用拍手代替这个数而不能报出。假设你连续听到m声拍手,问造成你听到m声拍手的第一下拍手所代表的数是几?

例如,你听到了两次连续的拍手,最小的可能这两次拍手是27和28,因此输出27。

输入m, 输出这m次连续的拍手第一下所代表的最小可能的数。 

题目说的还是较清楚的:

1、7的倍数

2、包含数字7的数

另外要求是连续拍手,最后输出是拍手的第一个数,当然这个数要求是最小可能。

0次 1

1次 7

2次 27 28

3次 70...

这样思路就比较清晰了,从1开始报数,找到一个最小的数,它的连续m个数满足以上两个要求之一即可,一直往上寻找即可,时间复杂度是线性的,当寻找到某一个数满足连续m个数,返回初始报数值即可;

#include<stdio.h>

int Seven(int num) //包含数字7
{
    while (num > 0)
    {
        if (num % 10 == 7) return 1;
        num /= 10;
    }
    return 0;
}

int number (int m)
{
    int start = 1;  //由1开始
    int count = 0;  //连续的个数
    int n = start;  //初始点

    while (count < m) //连续的个数
    {
        if (start % 7 == 0 || Seven(start) == 1)
        {
            if (count == 0) //重新计数,修改初始n
            {
                n = start;
            }
            count++;
        }
        else
            count = 0;  //非连续

        start++;
    }

    return n;
}
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{
    printf("%d",number(1111111));
    return 0;
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。

报数游戏(3)--【英雄会】

如上程序,起先在测试该测试点的时候我还担心通过时间会超过三秒,心想还得继续优化。不过,幸好,lucky,通过了,还是略水...

在家里做的第一道题啊,难得...话说家里冷啊,学校固然冷但是有暖气,诶,坚持下去!

马上过年了,也是马年哈,祝各位马年愉快!

(*∩_∩*)

报数游戏(3)--【英雄会】

上一篇:vmware虚拟机安装centos


下一篇:LeetCode之Partition List