前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#版 - ZJNUoj1259 - 幸运数字——中高级 - 题解

C#版 - ZJNUoj1259 - 幸运数字——中高级 - 题解

作者头像
Enjoy233
发布2019-03-05 15:54:52
6220
发布2019-03-05 15:54:52
举报

C#版 - ZJNUoj1259 - 幸运数字——中高级 - 题解

ZJNUoj1259 - Lucky numbers

Time Limit: 1000 ms       Memory Limit: 65536 KB Total Submissions: 116    Accepted: 76

在线提交: http://acm.zjnu.edu.cn/CLanguage/submitpage?problem_id=1259

Problem Description

数字4和7是幸运数字,而其他的都不是幸运数字。一个整数是幸运数字,当且仅当它的十进制表示只包含幸运数字。 现在让你给出第 K 个幸运数字(幸运数序列默认是从小到大排的)。

Input

第一行一个整数K (1 ≤K≤109≤K≤109\leq K \leq 10^9).

Output

打印出第 K 个幸运数字。

Sample Input

1 5 100 10000000

Sample Output

4 74 744747 44774447447477474444447

思路: 一开始用暴力法试了一下,代码如下: https://github.com/yanglr/AlgoSolutions/blob/master/tempSolutions/ZJNUoj1259_LuckyNum-brute-sol.cs 速度感受一下,40s,远超过1000ms,直接TLE。而且此时用的for循环的上界是100000000,题中要求的上界是100000000 0,更不满足要求了~

代码语言:javascript
复制
4
47
RunTime: 00:00:40.03

好吧,此路不通,那只能用别的思路~

找规律: f(1) = “4” f(2) = “7” f(3) = “44” = f(1)+”4” = f((3-1)/2) + “4” f(4) = “47” = f(1)+”7” = f((4-1)/2) + “7” f(5) = “74” = f(2)+”4” = f((5-1)/2) + “4” f(6) = “77” = f(2)+”7” = f((6-1)/2) + “7” ⋮⋮\vdots

递推关系如下:

f(n)={f(n奇−12)+‘‘4"f(n偶2)+‘‘7"(n=2⋅k−1,n∈Z)(n=2⋅k,n∈Z)f(n)={f(n奇−12)+‘‘4"(n=2⋅k−1,n∈Z)f(n偶2)+‘‘7"(n=2⋅k,n∈Z)f(n)=\left\{ \begin{array}{rcl} f(\frac{n_奇 -1}{2}) + ``4" & (n = 2 \cdot k -1, n \in Z) \\ f(\frac{n_偶}{2}) + ``7" & (n = 2 \cdot k, n \in Z) \end{array} \right.

其中+表示字符串的连接,k=⌊n2⌋k=⌊n2⌋ k = \lfloor \frac{n}{2} \rfloor,不论n是奇是偶,对其折半后下取整即可得到 k. C#实现的代码:

代码语言:javascript
复制
using System;

namespace ZJNUoj1259_LuckyNum
{
    class Program
    {
        public class Solution
        {
            public string GetKthLuckyNum(int n)
            {
                int k = (n - 1) / 2;
                if (n <= 0)
                    return String.Empty;
                if (n == 1)
                    return "4";
                if (n == 2)
                    return "7";

                return GetKthLuckyNum(k) + (n % 2 == 0 ? "7" : "4"); // 如果使用迭代或动态规划,变量名可选用 pre, res/current, next.
            }
        }

        static void Main(string[] args)
        {
            string str;
            while ((str = Console.ReadLine()) != null)
            {
                int k = int.Parse(str);
                var sol = new Solution();
                Console.WriteLine(sol.GetKthLuckyNum(k));
            }
        }
    }
}

提交到OJ的已AC代码(C++):

代码语言:javascript
复制
#include <iostream>
#include<string>
using namespace std;

string GetKthLuckyNum(int n)
{
    int k = (n - 1) / 2;
    if (n <= 0)
        return "";
    if (n == 1)
        return "4";
    if (n == 2)
        return "7";

    return GetKthLuckyNum(k) + (n % 2 == 0 ? "7" : "4");
}

int main() {
    int n;
    while (cin >> n)
    {
        cout << GetKthLuckyNum(n) << endl;
    }
    return 0;
}

Rank:

Result

Score

Time

Memory

Accepted

100

15MS

0K

其他方法: 1.完全二叉树 2.将4、7分别替换为0,1,然后在新数首位插入1,处理完成后换回4、7

ps: 京东2016、2017的校招中均考到了这题,有公司的面试中也考到此题~

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年07月28日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C#版 - ZJNUoj1259 - 幸运数字——中高级 - 题解
    • Problem Description
      • Sample Input
        • Sample Output
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档