链家 2018校招 笔试编程题

前端笔试题(一) 下面这些是一些经常碰到的笔试题,但是跟前端是没什么关系的,就是属于那种做技术岗都要会的那种,一般都是选择题或者填空题。 二叉树遍历 前序遍历 前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。 下面是百度百科例子截图: 后序遍历 后序遍历首先遍历左子树,然后遍历右子树,最后访问根结点,在遍历左、右子树时,仍然先遍历左子树,... 阅读详情

编程题一:
玥玥带乔乔一起逃亡,现在有许多东西要放到乔乔的包里面,但是包的大小有限,所以我们只能够在里面放入非常重要的物品.现在给出该种物品的数量,体积,价值的数值,希望你能够算出怎样能使背包的价值最大的组合方式,并且输出这个数值,乔乔会非常感谢你的
对于30%的数据
1<=n<=2000 1<=v<=500
1<=m<=10 1<=w<=20 1<=s<=100

输入
第 1 行有两个整数,物品种数 n 和背包装载体积v;
第 2 到 n+1 行每行三个整数,为第 i 种物品的数量m, 体积w,价值s
输出
仅包含一个整数,即为能拿到的最大的物品价值总和

Input
2 10
3 4 3
2 2 5
Output
13

思路:
动态规划

空间复杂度O(c*v)

#include <bits/stdc++.h>//包含C++的所有头文件
using namespace std;

int n, v, m, w[20001], s[20001];
int c=0;//c为物品总个数
int res[20001][501];//res[i][j]表示物品为1到i个,体积为j的情况下背包最大价值 空间复杂度O(c*v)
int main()
{
    memset(res,0,sizeof res);//对value清零
    scanf("%d %d", &n, &v);
    for(int i=1,j=1; i<=n; i++){
        scanf("%d %d %d", &m, &w[j], &s[j]);
        c += m;
        for(int k=1; k<m; k++){
            w[j+k] = w[j];
            s[j+k] = s[j];
        }
        j += m;
    }
    for(int i=1; i<=c; i++){
        for(int j=1; j<=v; j++){
            int k = j-w[i];
            res[i][j] = (k>=0 ? max(res[i-1][k]+s[i], res[i-1][j-1]) : res[i-1][j-1]);
        }
    }
    cout << res[c][v] << endl;
    return 0;
}

优化空间复杂度

#include <bits/stdc++.h>//包含C++的所有头文件
using namespace std;

int n, v, m, w[20001], s[20001];
int c=0;//c为物品总个数
int simple[501];//simple[v]表示物品为1到c个,体积为v的情况下背包最大价值 空间复杂度减小到O(v)
//空间复杂度减小到O(v)
int main()
{
    memset(simple,0,sizeof simple);//对value清零
    scanf("%d %d", &n, &v);
    for(int i=1,j=1; i<=n; i++){
        scanf("%d %d %d", &m, &w[j], &s[j]);
        c += m;
        for(int k=1; k<m; k++){
            w[j+k] = w[j];
            s[j+k] = s[j];
        }
        j += m;
    }
    for(int i=1; i<=c; i++){
        for(int j=v; j>=0; j--){
            int k = j-w[i];
            simple[j] = (k>=0 ? max(simple[k]+s[i], simple[j-1]) : simple[j-1]);
        }
    }
    cout << simple[v] << endl;
    return 0;
}

编程题二:
小明喜欢在火车旅行的时候用手机听音乐,他有 N 首歌在手机里,在整个火车途中,他可以听 P 首歌,所以他想产生一个播放表产生 P 首歌曲,这个播放表的规则是:
· 每首歌都要至少被播放一次
· 在两首一样的歌中间,至少有M首其他的歌
迈克在想有多少种不同的播放表可以产生,那么给你 N,M,P,你来算一下,输出结果取1000000007的余数

输入
输入 N,M,P
N 范围在 1 到 100
M 范围在 0 到 N
P 范围在 N 到 100
输出
输出结果 mod 1000000007 的余数

Input
1 0 3
Output
1

思路:
定义 List(i,j) 为安排列表中有 i 首歌时,已经用了 j 首不同歌, 此时的安排种类数
当 j>i 时,列表短但是歌曲过多,不合题意,所以种类数为0
当 j==i 时, 全排列 A(n,n)

另外,当 j>m 时就可以出现重复了,有两种安排方法,添加新歌,添加重复歌,所以其值就是这两种情况的和

  • 添加新歌
    List[i][j] = List[i-1][j-1]*(n-j+1);
  • 添加重复歌
    当 j<=n 时添加重复歌曲的种类为 songList(i-1,j)*(j-m)
    当 j>n 时添加重复歌曲的种类为 songList(i-1,j)*(n-m), 因为一共就 n 首歌
    最后List(n,p) 即为所求
#include <iostream>
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define inf 1000000007
using namespace std;

ll n,m,p,List[105][105];
int main()
{
    while(cin >> n >> m >> p){
        memset(List, 0, sizeof List);
        List[0][0] = 1;//为了计算全排列设置的值
        for(ll i=1; i<=p; i++){//列表
            for(ll j=1; j<=n; j++){//歌
                if(j > i){//歌比列表多
                    List[i][j] = 0;
                }else if(j == i){
                    List[i][j] = List[i-1][j-1]*(n-j+1);
                }else if(j > m){
                    List[i][j] = List[i-1][j-1]*(n-j+1) + List[i-1][j]*(min(j,n)-m);
                }else{
                    List[i][j] = 0;
                }
                if(List[i][j] >= inf)
                    List[i][j] %= inf;
            }
        }
        for(ll i=0; i<=p; i++){//列表
            for(ll j=0; j<=n; j++){//歌
                   cout << List[i][j] << " ";
            }
            cout << endl;
        }
        cout << List[p][n] << endl;
    }

    return 0;
}

优化空间复杂度为O(n)

#include <iostream>
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define inf 1000000007
using namespace std;

ll n,m,p,songList[105];
int main()
{
    while(cin>>n>>m>>p)
    {
        memset(songList,0,sizeof songList);
        songList[0]=1;
        for(ll i=1;i<=p;++i)
        {
            for(ll j=n;j>=0;--j)
            {
                if(j>i)
                    songList[j]=0;
                else if(j==i)
                    songList[j]=songList[j-1]*(n-j+1);
                else if(j>m)
                    songList[j]=songList[j-1]*(n-j+1)+songList[j]*(min(j,n)-m);
                else
                    songList[j]=0;
                if(songList[j]>=inf) songList[j]%=inf;
            }
            for(ll j=0;j<=n;++j)
            {
                cout<<songList[j] << " ";
            }
            cout << endl;
        }
        cout<<songList[n]<<endl;
    }
    return 0;
}

编程题三:
小明有 n( 1<=n<=2000 )个美味的食物,他想卖掉它们来赚钱.
这些食物放在一些箱子里,他们有些有趣的特性
1. 这些食物被编号为 1~n,每一天小明可以从这些箱子的头部或者尾部取出食物去卖
2. 这些食物放得越久,年龄越大,价值越大,食物 i 有一个初始的价值 v(i)
3. 放了 a 天后年龄为 a ,食物最终价值为 v(i)*a
给定每一个食物的初始价值v(i),请求出小明卖掉它们后可以获得的最大价值,第一天出售的食物的年龄为 1,此后每增加一天食物的年龄就加 1

输入
第 1 行:一个整数 n
第 2 到第 n+1 行:每个食物的初始价值 v(i)

输出
1 行:小明最终可以获得的最大价值

提示
样例说明:小明出售这些食物(初始价值1,3,1,5,2)的顺序为:
第一天卖掉第1个,
第二天卖掉第5个,
第三天卖掉第2个,
第四天卖掉第3个,
第五天卖掉第4个,获得最大的价值

1*1+2*2+3*3+4*1+5*5=43.

思路:
income[i][j] 表示还有第i个到第j个没卖出时,已经得到的最大收入
income[i][j] = max( income[i-1][ j]+food[i-1]*day, income[ i][ j+1]+food[j+1]*day )

#include <bits/stdc++.h>
using namespace std;
int n,food[2002],income[2002][2002],day,maxIncome;

int main()
{
    memset(income,0,sizeof income);
    maxIncome=0;
    cin>>n;
    food[0]=food[n+1]=0;
    for(int i=1;i<=n;++i)
    {
        cin >> food[i];
    }
    for(int i=1; i<=n; ++i)
    {
        day=i-1;
        for(int j=n;j>=i;--j)
        {
            income[i][j] = max(income[i-1][j]+food[i-1]*day, income[i][j+1]+food[j+1]*day);
            ++day;
        }
        maxIncome=max(maxIncome,income[i][i]+food[i]*n);
    }
    cout << maxIncome;
    return 0;
}

优化空间复杂度O(n)

#include <bits/stdc++.h>
using namespace std;
int n,food[2002],income[2002],day,maxIncome;
//income( i,j )=max( income( i-1,j )+food[i-1]*day,income( i,j+1 )+food[j+1]*day )
int main()
{
    memset(income,0,sizeof income);
    maxIncome=0;
    cin>>n;
    food[0]=food[n+1]=0;
    for(int i=1;i<=n;++i)
    {
        cin>>food[i];
    }
    for(int i=1;i<=n;++i)
    {
        day=i-1;
        for(int j=n;j>=i;--j)
        {
            income[j]=max(income[j]+food[i-1]*day,income[j+1]+food[j+1]*day);
            ++day;
        }
        maxIncome=max(maxIncome,income[i]+food[i]*n);
    }
    cout<<maxIncome;
    return 0;
}

其他思路,点击链接

编程题四
在迷迷糊糊的大草原上,小红捡到了n根木棍,第i根木棍的长度为i,小红现在很开心。她想选出其中的三根木棍组成美丽的三角形。但是小明想捉弄小红,想去掉一些木棍,使得小红任意选三根木棍都不能组成三角形。请问小明最少去掉多少根木棍呢?
输入
本题包含若干组测试数据。

对于每一组测试数据。
第一行一个n,表示木棍的数量。

满足 1<=n<=100000

输出
输出最少数量

样例输入
4
样例输出
1

本题思路很简单,其实就是一个斐波那契数列的问题
因为有多组参数,所以先用打表法,先求出100000以内从1、2、3开始的斐波那契数列
然后进行根据输入的n,查找小于等于n的斐波那契数列元素有res个,最终输出结果就是n-res。

注意本题是多组输入。

#include <iostream>
#include <vector>
#define TOP 100000
using namespace std;

int main()
{
    vector<int> res = {0, 1, 2};
    for(int i=3; res[i-1]+res[i-2]<=TOP; i++)
        res.push_back(res[i-1]+res[i-2]);
    for(int n; cin>>n; ){//多组输入
        //函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。
        //如果所有元素都小于val,则返回last的位置
        vector<int>::iterator it = lower_bound(res.begin(), res.end(), n);
        int temp = (*it==n ? 0 : *it-n-1);//没有在斐波那契数列中找到n,减去temp
        cout << *it - (it-res.begin()) - temp << endl;
    }
    return 0;
}

编程题五:
在小红家里面,有n组开关,触摸每个开关,可以使得一组灯泡点亮。
现在问你,使用这n组开关,最多能够使得多少个灯泡点亮呢?

输入
第一行一个n,表示有n组开关。
接下来n行,每行第一个整数为k,表示这个开关控制k个灯泡,接下来k个整数,表示控制的灯泡序号。

满足:
1<=n<=1000
1<=k<=1000
序号是在int范围内正整数。

输出
输出最多多少个灯泡点亮。

输入
2
2 1 2
2 2 3
输出
3

输入
3
1 1
1 2
2 1 2
输出
2

关键点:题目只说开关点亮灯泡,两个开关同时开一个灯泡,依旧灯泡是亮的
set去重即可

#include <iostream>
#include <set>
using namespace std;

int main()
{
    for(int n; cin>>n; ){
        set<int> s;
        for(int i=0; i<n; i++){
            int k; cin >> k;
            for(int j=0; j<k; j++){
                int temp;
                cin >> temp;
                s.insert(temp);
            }
        }
        cout << s.size() << endl;
    }

    return 0;
}
2018网易前端开发工程师笔试卷讨论 又是一年季,实习面试对于2019届的我们已经越来越近了,做了两次笔试试水,感觉还是没有十足的把握完成笔试卷,任重道远啊。 来看看这次的笔试题吧。单选,20题(40分) CSS HTML5(新特性的考察) JS(this,setTimeout,typeof,window对象) 数据结构(表,栈,二叉树) 操作系统 正则表达式 计算机网络 设计模式 算法(排序算法(二分查找算法),空间复杂度) 阅读详情

相关推荐

腾讯经历汇总

一、腾讯流程 讯进行之前包含:内推和提前批两个环节;提前批没通过仍可以正常参加9月份的聘 内推可参考:2018腾讯聘内推启动 二、腾讯求职经验 2017腾讯面试回忆(成功拿到offer) 腾讯2017实习生面试总结 腾讯实习生面试经验 (已拿offer) ...

yph001的博客 8640

编程题:食物记录

用C++编写的食物记录小程序,主要涉及文件读取和写入,字符串提取,容器等知识。

【牛客】摩拜2018数据分析工程师笔试解析

【牛客】摩拜2018数据分析工程师笔试解析 * 选择题都有正确答案,后面五道大题均是我的答案,欢迎大讨论纠正! (https://www.nowcoder.com/test/11453292/summary) 一、选择题 1、在Shell编程中,下面哪个表示上一步所运行程序的返回值() 答:$?   2、在SQL语言中,子查询是(    )  答:嵌入到另一个查询语句之中的查...

NJYR21的博客 3315

阿里p9教你Java学到什么程度才能叫精通?

List ite 全文分为:基础知识和进阶知识下文java必会知识附答案!并为大整理了一个pdf,所有的知识点和答案都在pdf里面。必会知识点及其答案!!!Java基础知识()https://blog.csdn.net/qq_16633405/article/details/79211002Spring Boot 启动 流程()https://juejin.im/post/5b679fbc5188251aad213110#heading-0Spring 一些面试题()https://www.ctoli..

dcj19980805的博客 711

2018笔试编程题

解题思路:记录每一组的编号上界,从左侧开始搜寻,如果小于或等于某组的边界,就是在该组。#include<iostream> #include<vector> using namespace std; int main() { int n; cin>>n; int index=0; vector<int>a; vector<int>b; for(int

u012124634的博客 2565

笔试题整理

1.撤销操作如何实现?撤销功能的实现备忘录模式2.1000万个数找出两数之和为K的数用HashMap实现,key为 具体的数字,value为数字出现的次数3.一个含有n个元素的数组,找出m个数使其和为K的组合public class Test { public static void main(String[] args) { int[] nums ={ 1, 2, 3,

wmingstar 5647

2018笔试编程题题解

1.Light在小红里面,有n组开关,触摸每个开关,可以使得一组灯泡点亮。 现在问你,使用这n组开关,最多能够使得多少个灯泡点亮呢? 输入 第一行一个n,表示有n组开关。 接下来n行,每行第一个整数为k,表示这个开关控制k个灯泡,接下来k个整数,表示控制的灯泡序号。 满足: 1&lt;=n&lt;=1000 1&lt;=k&lt;=1000 序号是在int范围内正整数。 输出...

carson0408的博客 895

2017年前端面试题

2017年前端面试

那些年写过的代码 3705

2018内推-大数据开发工程师笔试编程题

题目1(如下截图所示): 分析:一个排序问题 C++实现: #include using namespace std; void insertSort(int *a,int *b,int n){ int tmp_a,tmp_b;//监视哨 for(int i=1;i<n;i++){ if(b[i]<b[i-1]){ tmp_b=b[i]; tmp_a=a[i

data_heng 1084

网易2018笔试编程题

网易2018笔试编程题 网易2018笔试编程题 魔法币 相反数 魔法币 小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币。 魔法机器1:如果投入x个魔法币,魔法机器会将其变为2x+1个魔法币 魔法机器2:如果投入x个魔法币,魔法机器会将其变为2x+2...

t617的博客 5176

2018有赞笔试

昨天晚上参加了有赞Java类笔试,题目总体难度适中,这里我给大介绍一下这次笔试的三个编程题。第一题: 1.题目 2.思路 我对这个题目的基本思路是用空格分隔字符串得到字符串数组,该字符串数组元素可能是空,也可能是包含单词和空格的字符串。然后将数组转换成List,对List的每个元素处理成开头大写、之后小写的形式再输出。3.实现 以下代码是我的实现:package com.liu.d

一亩三分地 5291

钜泉光电2018年 IC笔试题目

前言 整理数字ic笔试面试题目,补充知识点! 声明:个人觉得,学习期间,基本上都是知识的搬运,所以本博客所有内容都可以被大引用!为了大方便引用,博客内的图片都没有加博客的水印(除非不是自己的或者没看到)! 这篇文章会基于下面这些文件整理,并参考钜泉光电2018IC设计笔试题,希望大有所了解。 本文的ppt,请点击接下载! 钜泉光电 钜泉光电官网www.hitrendtech.com/ 2020年宣讲会 薪资和福利 晋升和发展 热点答疑 数字验证工程师岗位 笔试题 0

杰之行的博客 1万+

我的2018

2018年部分公司经验,Android

逍遥林 1717

2018笔试

一、一个含有n个元素的数组,找出m个数使其和为K  参考:打印和为sum的组合,动规法+DFS+迭代法https://blog.csdn.net/qq_19446965/article/details/81775702 动态规划:只能找出一组,O(n^2) 找出所有参考上述;接 // 打印和为n的组合,动规法,O(n^2) public static List&lt;Integ...

Rnan_prince的博客 2159

2017京东在线笔试编程题之 买东西

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl

u010450544的博客 3165

2016年笔试(JAVA研发)

一、单选题 1. 在编写java Applet程序时,需在程序的开头写上()语句 A. import java.awt.*; B. import java.applet.Applet; C. import java.io.*; D. import java.awt.Graphics;   2. 下面的程序段创建了BufferedReader类的对象in,以便读取本机c盘my文件夹下的

小拳头的博客 4417

[牛客]乔乔的包(Java)(动态规划)

接:https://www.nowcoder.com/questionTerminal/a16b6679cc1841c3a20324279116d040?orderByHotValue=0&page=1&onlyReference=false 来源:牛客网 [编程题]乔乔的包 时间限制:1秒 空间限制:32768K 【问题描述】 玥玥带乔乔一起逃亡,现在有许多的东西要放到乔...

凉月的博客 448

牛客网编程规范c++版本

直接以一个题目为例子 题目描述 玥玥带乔乔一起逃亡,现在有许多的东西要放到乔乔的包里面,但是包的大小有限,所以我们只能够在里面放入非常重要的物品。现在给出该种物品的数量体积价值的数值,希望你能够算出怎样能使背包的价值最大的组合方式,并且输出这个数值,乔乔会非常感谢你。 输入描述: 第1行有2个整数,物品种数n和背包装载体积v; 第2行到i+1行每行3个整数,为第i种物品的数量m、体积w、价值s...

博客 1279
上一篇: 贝壳找房 2019校招 研发类试卷C++ 选择题 2018.08.19
下一篇: KEEP 2019校招提前批 Java工程师 笔试编程题-2018.08.23
whl_program
博客等级 码龄11年 101粉丝 279原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值