链家秋招内推编程笔试题目

链家秋招内推编程笔试题目

大家好,又见面了,我是全栈君。

参加8.19的链家内推笔试,总体来说题目难度不大,20个选择题还有三道编程题。

选择题,里面有两道关于IP地址计算的题目,有点忘了,不知道最后的计算有没有问题,所以还需要复习学习完的知识,

因为不知道什么时候就会遇到相关的问题。

编程题,自我感觉,难度是偏简单的,如果不能达到两道AC,那就是不合格了。

 

1. 给定的一个1,2,3组成的数字序列,排成升序所需的最少交换次数 。

样例输入:

9

2

2

1

3

3

3

2

3

1

样例输出:
4

 

思路:

应使用贪心算法。

分析:先存入数组,然后记录有多少个1,多少个2,多少个3,然后记录应该是1的领地里不是1的个数,记录2的领地里3的个数,记录3的领地里2的个数 则我们要做的是把1的领地里非1的元素同后面两个区域里的1交换, 在1的领地里把2同 2的领地里的1 交换,把3同 3的领地里的1 进行交换 。 完了会出现2和3里面分别有3和2的情况,取2和3里的非自己人的最大数,同1里的为自己人数相加即为需要交换的最小次数。

即ans=x+max(y,z);

 

总结: 统计在应该是1的位置出现2的个数为a1;

          统计在应该是2的位置出现1的个数为a2;

          统计应该是1、2的位置出现3的个数为a3;

          那么最少交换次数为:a3 + (a1 > a2 ? a1: a2)

代码如下:

 

#include<iostream>
#include<vector>
#include<cmath>
#include<cstring>

using namespace std;

int main(){
    int x=0,y=0,z=0;//分别存放1的位置非1的个数,2的位置3的个数和3的位置2的个数;
    int n;
    cin>>n;
    vector<int> vec;//存放要输入的序列;
    int b[3];//用于存放序列中1,2,3的个数各是多少;
    int num;
    b[0]=0;//之前用memset初始化,结果存在很大问题。
    b[1]=0;
    b[2]=0;

    
    for(int i=0;i<n;i++){
        cin>>num;
        vec.push_back(num);
    }

    for(int i=0;i<n;i++){
        b[vec[i]-1]++;
    }

    for(int i=0;i<b[0];i++){
        if(vec[i]!=1){
            x++;
        }
    }
    for(int i=b[0];i<b[0]+b[1];i++){
        if(vec[i]==3){
            y++;
        }
    }
    for(int i=b[0]+b[1];i<n;i++){
        if(vec[i]==2){
            z++;
        }
    }
    int res=x+max(y,z);
    cout<<res;
    system("pause");
    return 0;
}

 

反思:这道题目自己做的时候,思路不对,而且没有认真去思考当要求交换最少的时候,实际上是为了尽可能一次交换使得两个数字归位。

所以,应该尝试去写一写,多试几个例子。

 

问题:为什么这样用memset不能清零

#include<stdio.h>
#include<string.h>
int main()
{

   int i,a[100];
   memset(a,0,100);//改memset(a,0,sizeof(a));或memset(a,0,100*sizeof(int));就可以了
   for(i=0;i<100;i++)
       printf(“%d “,a[i]);
   return 0;

}

解决:memset(a,0,100);//改memset(a,0,sizeof(a));或memset(a,0,100*sizeof(int));就可以了

原因:void *memset(void *s, int ch, unsigned n)函数的作用:将s所指向的某一块内存中的每个字节(注意这里是每个字节,你可能用字符串习惯了)的内容全部设置为ch指定的ASCII值,memset 工具块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。 

原本定义的是整型, 占一个字节  memset(a,0,100*sizeof(int)) 这样是100个4个字节的内存

 

 

 

2. 类似牛客上原题,奖学金;

小v今年有n门课,每门都有考试,为了拿到奖学金,小v必须让自己的平均成绩至少为avg。每门课由平时成绩和考试成绩组成,满分为r。现在他知道每门课的平时成绩为ai ,若想让这门课的考试成绩多拿一分的话,小v要花bi 的时间复习,不复习的话当然就是0分。同时我们显然可以发现复习得再多也不会拿到超过满分的分数。为了拿到奖学金,小v至少要花多少时间复习。
链接:https://www.nowcoder.com/questionTerminal/cee98a512ec246a2918ea8121f7612c8 来源:牛客网

 
示例1

输入

5 10 9
0 5
9 1
8 1
0 1
9 100

输出

43

 

代码如下:

 

#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
bool cmp(const pair<int, int>p1,const pair<int, int>p2){
    return p1.second<p2.second;
}
 
int main()
{
    int n,r,avg;
    while(cin>>n>>r>>avg){
        vector<pair<int, int> > vec;
        int a = 0;
        int b = 0;
        for(int i=0;i<n;i++){
            cin>>a>>b;
            vec.push_back(make_pair(a,b));
        }
 
        long long target = vec.size()*avg;
        long long score_cur = 0;
        long long time = 0;
        for(int i=0; i<vec.size(); ++i){
            score_cur += vec[i].first;
        }
 
        if(score_cur >= target){
            cout<<"0"<<endl;
        }
        else{
            sort(vec.begin(),vec.end(),cmp);
            for(int i=0;i<vec.size();i++){
                score_cur += (r - vec[i].first);
                if(score_cur >= target){
                    score_cur -= (r - vec[i].first);
                    time += (target - score_cur)*vec[i].second;
                    cout<<time<<endl;
                    break;
                }
                else
                    time += (r - vec[i].first)*vec[i].second;
            }
        }
 
    }
     
    return 0;
}

反思:对于这道题目的求解思路没有问题,但是在实现上有问题。对于容器的熟练度不够,除了vector,set,map等之外,还应该知道pair,熟练使用,这会很方便。

 

3. 应该是最简单的一道,数组的去重排序,用set容器非常方便;

利用set自带特性,直接简要去重的数组依次插入即可。

 

代码如下:

 

#include <iostream>
#include<set>
using namespace std;
int main(int argc, char *argv[])
{
	int n;
	set<int> s;

	cin >> n;
	int num;
	for (int i = 0; i<n; i++){
		cin >> num;
		s.insert(num);
	}

	//set<int>::iterator it;

	for (auto it = s.begin(); it != s.end(); it++)
	{
		if (it == --s.end())
			cout << *it << endl;
		else
			cout << *it << " ";
	}
	system("pause");
	return 0;
}

 

 反思:题目很简单,但是要熟练迭代器。

 

总结:从这些题目,应该能看出容器的作用了。一定要熟练。

 

2018.8.22

 

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108214.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 改进神经风格迁移_癌细胞能否沿着神经迁移

    改进神经风格迁移_癌细胞能否沿着神经迁移神经风格迁移使用CNN将一幅图像的艺术风格转移到另一幅图像。但神经风格迁移存在两个缺陷,首先是神经风格迁移基于神经网络训练反向传播,因此速度较慢,同时风格迁移会获取风格图像所有风格信息,包括颜色和笔触等,不能进行更好的控制。因此许多论文和应用针对原始的神经风格迁移的缺点进行了改进。学会神经风格迁移,免费获取价值百元DIY数字油画定制照片。

    2025年7月24日
    2
  • 百度爬虫robots.txt文件规范[通俗易懂]

    百度爬虫robots.txt文件规范[通俗易懂]robots.txt文件的格式 robots文件往往放置于根目录下,包含一条或更多的记录,这些记录通过空行分开(以CR,CR/NL, or NL作为结束符),每一条记录的格式如下所示:    “:” 在该文件中可以使用#进行注解,具体使用方法和UNIX中的惯例一样。该文件中的记录通常以一行或多行User-agent开始,后面加上若干Disallow和Allow行,详细情

    2022年5月2日
    40
  • 网络规划与设计「建议收藏」

    网络规划与设计「建议收藏」一、网络生命周期网络生命周期就是网络系统从思考、调查、分析、建设到最后淘汰的总过程。常见的网络生命周期是四阶段周期模型、五阶段周期模型、六阶段周期模型。1.四阶段周期模型特点:能够快速适应新的

    2022年7月3日
    23
  • 手机的分辨率和电脑的分辨率_手机屏幕分辨率大全

    手机的分辨率和电脑的分辨率_手机屏幕分辨率大全电脑分辨率分辨率比例是否淘汰1920*108016:9主流1366*76816:9主流1600*90016:9非主流2560*160016:10非主流1920*120016:10非主流1440*90016:10非主流1680*105016:10非主流1024*7684:3非主流800*6004:3非主流比例=高度/宽度手机分辨率ios型号分辨率像素密度(pp…

    2022年8月13日
    2
  • 视频直播之基础原理

    视频直播之基础原理SDK(SoftwareDevelopmentKit):软件开发工具包涉及的技术:采集处理编码封包推流播放RTMP(RealTimeMessagingProtocol,实时消息传送协议),是AdobeSystems公司为Flash播放器和服务器之间音频、视频和数据传输开发的开放协议。优点:主流CDN支持,市面上绝大多数的直播产品采用;协议简单易实现缺点:基于…

    2022年7月23日
    12
  • 数据库与spring事务隔离级别不一致_spring事务传播行为

    数据库与spring事务隔离级别不一致_spring事务传播行为脏读:一个事务读取到另一个事务未提交的数据,出现脏读的本质是是因为操作(修改)完数据就立马释放掉锁,导致其他事务可以读取数据,而读取的数据是无用的或者错误的。不可重复读:一个事务读取到另外一个事务已经提交的数据,即一个事务可以看到其他事务所做的修改。幻读(虚读):一个事务内读取到了别的事务插入的数据,导致前后读取不一致。查看当前会话隔离级别:select@@tx_isolation;查看…

    2022年10月21日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号