• [编程题]记一下腾讯2017年在线笔试题编程题的思路


    三道题拿分都不难,不过这个在线网页撸代码的熟练度还得再提高一下(做的时候C的调试有时候不灵光, Python编辑器的自动缩进功能肯定有bug...)。

    第一题是给四个数A,B,C,D, 给两种变换操作: 第一种: A, B同时+1, 第二种, A, B同时乘2。问最少几次操作后可以把A和B同时恰好变换成C, D, 没有变换方法就输出-1。

    这道题应该是可以推数学表达式的,应该存在O(logn)甚至O(1)的方法。不过考试拿分起见,就先写一个dfs模拟。

    具体写法就是dfs(A_tmp, B_tmp, level),递归调用dfs(A_tmp + 1, B_tmp + 1, level + 1) 和dfs(A_tmp * 2, B_tmp * 2, level + 1)。全局维护一个最小操作数,并做好剪枝工作,就可以顺利拿分了。

    第二题,题目就是有[1,1,2,2,4,4,..., 2^18, 2^18] ,即从2^0到2^k恰好每个数有两个的可用因子,给一个目标整数N,问从这些因子里部分累加,可以凑成N的总的组合数量。

    这题应该算是整数划分题,不太明白的同学可以搜搜“整数划分”或者看郭炜老师的慕课的DP部分找找感觉。

    但是...我也对这个题型有点生疏了,就想先用dfs试试看。

    同样,为了拿分,就先生成一个长度38的数组arr,里面放[1,1,2,2,...2^18, 2^18]。需要指出的是C语言里这里要用long long。

    然后做dfs模拟,dfs(i)代表取arr[i]作为因子,全局维护一个cntTmp,调用就加return前减。当cntTmp< target(目标和)时遍历dfs(i + 1) 到dfs(37)。

    此外还需要记录dfs路径,构造一个哈希函数,做哈希和校验,以防止dfs搜出重复路径。

    同样,做好剪枝工作,复杂度看着很高啊O(2^(2k))?(是不是啊同志们,这里我没把握)。。。(k有18也太高了)

    然后我发现我的页面的debug系统挂了,输出永远是空,我觉得服务器那边一直就只收到了一个默认代码,这种的:

    int main() {return 0;}

    Ctrl+F5都救不回来。。。

    第三题,给了一个图。求节点0到节点1的最短路。多加了了一个变量k(打对折的机会),意思是在每次走一个edge的时候有机会把edge的cost减半,共k次机会。

    那么维护的状态cost[i]就变成了cost[i][j],意思是到达i且花费了j次打折机会的最小cost。

    本来想快速写一个Bellman-Ford朴素最短路过样例再说,复杂度在O(k * n^2)。

    无奈在第二题用时太长了,导致这题只留了10分钟,没有成功写出能过样例的代码。

    最后,祝大家撸题愉快,找工作顺利。

    就这样,以上。

  • 相关阅读:
    [转]C#获取文件的MD5值
    跨域ajax返回
    根据子表的条件修改主表的数据
    网络与多线程的设计例子
    网络与多线程的设计模式
    tcpdump移植和使用 -- by Johnson
    关于程序的歪门邪说--by Johnson
    重装系统——联想window 10
    Qt项目中error: C2001: newline in constant错误的解决
    使用NSIS制作Windows安装程序快速入门
  • 原文地址:https://www.cnblogs.com/aweffr/p/7516124.html
Copyright © 2020-2023  润新知