3.24晚的笔试,结束后题目看不到了,有人截图了,来源:https://www.jianshu.com/p/00d3fd1d9e23


最新更新:在leetcode 上有一道类似的题,区别在于第一种操作没有s = s + s。leetcode上这道题可以看作是找到一个数n所有的素数因子之和;头条这题类似,是找到一个数n所有素数因子之和,再减去因子的个数。那么可以用动规,也可以递归。
下面给出递归的代码,非常简洁;

int recursion(int n) {if (n == 1) return 0;for (int i = 2; i <= int(sqrt(n)); i++)if (n % i == 0) return i - 1 + recursion(n / i);return n - 1;
}

然后我又想到了一个可以优化的地方,就是每次递归函数里的i只要从上一个因子开始找就行,改进后的代码:

int recursion(int n, int p) {if (n == 1) return 0;for (int i = p; i <= int(sqrt(n)); i++)if (n % i == 0) return i - 1 + recursion(n / i, i);return n - 1;
}


由于看到很多人给出的都是广度优先搜索(BFS)的解法,或者是二维动态规划的解法;前者是指数时间的算法,后者时间、空间复杂度均为O(n^2)。本文提出一种多项式复杂度解法,时间复杂度O(n^(1.5)),空间复杂度O(n)的一维动态规划。
递推公式:dp[i] = p - 1 + dp[(i / p)]; p 是从小到大第一个能整除i的数(从2开始找,实际上只要找素数就行)。

int DP(int n) {vector<int> dp(n+1, 0);dp[1] = 0;for (int i = 2; i <= n; i++) {for (int j = 2; j <= int(sqrt(i)); j++) {if (i % j == 0) {dp[i] = j - 1 + dp[i/j];break;}}if (dp[i] == 0) dp[i] = i - 1;}return dp[n];
}

实际上上面的代码可以优化的地方:先计算出1~sqrt(n)范围内的所有素数;然后只要在这些素数里找到第一个符合条件(整除)的素数就行。所以平均的时间复杂度几乎是线性的。
下面是优化后的代码:

int DP(int n) {vector<int> prime;for (int i = 2; i <= int(sqrt(n)); i++) {int flag = true;for (int j = 2; j <= int(sqrt(i)); j++) {if (i % j == 0) { flag = false; break; }}if (flag) prime.emplace_back(i);}vector<int> dp(n+1, 0);dp[1] = 0;for (int i = 2; i <= n; i++) {for (int j = 0; j < prime.size() && prime[j] <= int(sqrt(i)); j++) {if (i % prime[j] == 0) {dp[i] = prime[j] - 1 + dp[i/prime[j]];break;}}if (dp[i] == 0) dp[i] = i - 1;}return dp[n];
}

测试了一下性能,当n为1000000时,也只需要0.25s的时间;


第一次在CSDN上发博客,不太熟悉排版,请见谅。如有错误,欢迎讨论。

今日头条2018校园招聘第一次笔试第二题“字符串拼接”题解(一维动态规划及递归解法)相关推荐

  1. 今日头条2018校园招聘后端开发工程师(第二批)编程题 - 题解

    以前做过第三批的题目,今日头条2018校园招聘后端开发工程师(第三批)编程题 - 题解.这一场的题目偏技巧和算法,而第三批的题偏编码.这一场涉及的算法有二分查找.区间动态规划. 原题链接:点这儿. 第 ...

  2. 今日头条2018校园招聘后端开发工程师(第四批)编程题 - 题解

    做过第三批的题目,今日头条2018校园招聘后端开发工程师(第三批)编程题 - 题解和第二批的题目,今日头条2018校园招聘后端开发工程师(第二批)编程题 - 题解. 这一场题目还是挺好玩的,也挺有技巧 ...

  3. 今日头条2018校园招聘后端开发工程师(第二批)编程题 (Java版)

    本人技术小白一枚,文章只是记录个人的解题思路和过程 牛客网地址:原题链接 第一题:用户喜好 题目 为了不断优化推荐效果,今日头条每天要存储和处理海量数据.假设有这样一种场景:我们对用户按照它们的注册时 ...

  4. 今日头条2018校园招聘后端开发工程师(第三批)编程题 - 题解

    昨天做了下头条的后端开发工程师的编程题,这编码量大啊,两个小时,三个编程题,一个改错题,一个设计题,说实话,很考技术含量,而且编程题中有两个还特别考细心编码,如果两个小时能做三个题,确实非常不错了,写 ...

  5. 今日头条2018校园招聘后端开发工程师 (第二批) 编程题 - 字母交换

    题目描述: [编码题]字符串S由小写字母构成,长度为n.定义一种操作,每次都可以挑选字符串中任意的两个相邻字母进行交换.询问在至多交换m次之后,字符串中最多有多少个连续的位置上的字母相同? 输入描述: ...

  6. 今日头条2018校园招聘第一题 ---POJ 2479

    第一次参加公司的招聘笔试,虽然只是抱着试试水的心态去参加的,可惜的是第一题就做错了..... 第一题,其实只是一个求最大子段和的变式题,不过笔试的时候也不知道怎么了,就是不知道思路,最后还写了一个错的 ...

  7. 手串(暴力) - 今日头条2018校园招聘后端方向(9.10)

    时间限制:1秒 空间限制:65536K 题目描述 作为一个手串艺人,有金主向你订购了一条包含n个杂色串珠的手串--每个串珠要么无色,要么涂了若干种颜色.为了使手串的色彩看起来不那么单调,金主要求,手串 ...

  8. 2012年奇虎360校园招聘实习生笔试编程题

    2012年奇虎360校园招聘实习生笔试编程题 1.  自己实现库函数 int atoi(const char* str);  注意两点:(1). 字符串中,符号位的处理. (2).字符串中,出现非数字 ...

  9. 腾讯2017年校园招聘笔试题第二题

    下面是腾讯2017年校园招聘笔试题第二题,在这里跟大家一起分享: 1. 题目 2. 我的思路 这题我觉得题目说的很清楚了.用类似于二分查找的方法,记录最大值.最小值和中间值,判断并记录在左区间(值为0 ...

最新文章

  1. Design Pattern - Adapter Pattern
  2. lambada表达式
  3. 如何缩短visual studio行号的距离
  4. Android Studio(13)--- Git之使用GitHub搭建远程仓库
  5. .NET简谈自定义事务资源管理器
  6. win11开机记录如何查看 Windows11查看开机记录的设备方法
  7. mysql bing logo_mysqlbing log
  8. mongodb搭建和基本语法
  9. charles windows版使用教程
  10. 用c语言写双人贪吃蛇,试图写了一个双人贪吃蛇,结果蛇竖着跑正常,横着跑就只有头了,求解~...
  11. 软考高项优秀范文——论信息系统项目的风险管理
  12. 删除设备和驱动器下的百度云盘的图标
  13. 微软mes杀毒更新服务器搭建,我的系统的不能用Microsoft Update更新的啊
  14. 获利能力分析实际数据收集流程
  15. python exec 函数_Python之浅谈exec函数
  16. latex 多张子图,横栏/双栏
  17. 基于php+mysql的 医院病房管理系统
  18. JS 把时间戳转化成YY-MM-DD
  19. 【安卓Framework学习】Wifi框架学习之核心类
  20. 微博服务器瘫痪容易修复吗,微博服务器九次瘫痪,还有一个竟然连崩四回,程序员:放过我吧!...

热门文章

  1. python 基于pillow模块生成随机图片验证码教程
  2. 电脑备份iphone_如何在Linux上备份iPhone?
  3. 网络通信类API 推荐
  4. (使用HTML5和CSS3开发电子商务网站)第一章HTML5基础
  5. 如何在 Excel 中对齐或旋转单元格中的文本?
  6. 美版S4 (SCH-R970) 刷机完全教程(非常详细)
  7. 总怪孩子沉迷刷手机?其实家长也好不了多少
  8. 计算机三十首音乐是什么歌曲,2020开车必听歌曲排行榜 车上常放的三十首歌曲...
  9. 数据仓库的模型设计 A. 数据建模方法论 数据仓库模型设计遵循“自顶向下、逐步求精”的设计原则。 模型设计分为三个阶段: 1,概念模型 对业务的范围和使用,从高度上进行抽象概括,也就是划分主题域。 一
  10. 罗德里格斯公式(Rodrigues Formula)