某公司算法岗笔试题(部分)

2023-05-16

今天参加了第一次笔试,准备的不是很好,分享几道题。

## 1.选择题:

int i=1;
const int j=1;
下列错误的是:
const int *p1=&i;
const int *p1=&j;
int * const p1=&i;
int * const p2=&j;

本题考察了const和指针:

/*
* @Author: lenovouser
* @Date:   2020-07-23 21:41:23
* @Last Modified by:   lenovouser



* @Last Modified time: 2020-07-23 22:00:00



*/
#include <exception>
#include <iostream>
int main(int argc, char const *argv[])
{
    int i=1;
    const int j=1;

    const int *p1=&i;

    const int *p2=&j;

    int * const p3=&i;

    int * const p4=&j;



    return 0;
}

结果:

Compilation Failed


/usercode/file.cpp: In function ‘int main(int, const char**)’:
/usercode/file.cpp:26:21: error: invalid conversion from ‘const int*’ to ‘int*’ [-fpermissive]
     int * const p4=&j;
                     ^

居然只有最后一个是错的。首先前两个是指const int的指针,后两个是int的const指针,因为&j是一个const int的指针,不能赋值给int*,因为右边到左边需要补充一些性质。我会认为第一个也是错的,不过其实int的指针可以转为const int的指针,这样是多到少,需要丢弃一些性质。

#include <exception>
#include <iostream>
int main(int argc, char const *argv[])
{
    int i=1;
    const int j=1;

    const int *p1=&i;
    std::cout<<p1<<std::endl<<&i;

    const int *p2=&j;

    int * const p3=&i;

    // int * const p4=&j;



    return 0;
}

输出:

0x7fffefb4d380
0x7fffefb4d380

但是*p1无法赋值,而i可以赋值:



#include <iostream>
int main(int argc, char const *argv[])
{
    int i=1;
    const int j=1;

    const int *p1=&i;
    std::cout<<p1<<std::endl<<&i;
    i=2;
    *(&i)=3;
    *p1=2;

    const int *p2=&j;

    int * const p3=&i;

    // int * const p4=&j;



    return 0;
}

结果:

Compilation Failed


/usercode/file.cpp: In function ‘int main(int, const char**)’:
/usercode/file.cpp:24:8: error: assignment of read-only location ‘* p1’
     *p1=2;
        ^

 



#include <iostream>
int main(int argc, char const *argv[])
{
    int i=1;
    const int j=1;

    const int *p1=&i;
    // std::cout<<p1<<std::endl<<&i;
    i=2;
    *(&i)=3;
    std::cout<<i<<" "<<(p1==&i);
    // *p1=2;

    const int *p2=&j;

    int * const p3=&i;

    // int * const p4=&j;



    return 0;
}

3 1
好吧,这个应该就是编译器已经认定了p1是const int的指针,它的内容不可以改变,根本不核实*p1的类型。是我没考虑清楚。

## 2.选择题



#include <iostream>
int f(int n)
{
    int cnt=0;
    while(n)
    {
        cnt++;
        n=n&(n-1);
        
    }
    return cnt;
}
int main(int argc, char const *argv[])
{
    int m=1222;
    const int n=m;
    int i=n;

    std::cout<<f(i);
    return 0;
}

5

看来应该是只有指针才有const*不能到*的转换,当然可以借助强制类型转换,参考https://blog.csdn.net/alidada_blog/article/details/83536149

这个题其实是在1222=010011000110,计算这个数的1的个数。

1222=010011000110

1221=010011000011

与一次就会少一个1。

## 3选择题



#include <iostream>
char* f(char a[100])
{
    char b[10];
   return b;
}
int main(int argc, char const *argv[])
{
    char *p;
   p= f(p);
    
    p="123";
    std::cout << p << std::endl;
    return 0;
}

问这代码有错没:

123


/usercode/file.cpp: In function ‘char* f(char*)’:
/usercode/file.cpp:6:10: warning: address of local variable ‘b’ returned [-Wreturn-local-addr]
     char b[10];
          ^
/usercode/file.cpp: In function ‘int main(int, const char**)’:
/usercode/file.cpp:14:6: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
     p="123";
      ^

我用的编译器暂时没看出来有错。

 

## 4程序:

输入1,2,3,4,5,让这个数组循环右移3位,输出3,4,5,1,2。


#include<vector>
#include <iostream>
#include <numeric>
void shift(int* a,int step,int len)
{
  int b[5];
  for (int i = 0; i < len; ++i)
  {
    int temp=(i+step)% len;
    b[temp]=a[i];
  }

    for (int i = 0; i < len; ++i)
  {
    std::cout<<b[i]<<" ";
  }
}
int main(int argc, char const *argv[])
{
    int a[5]={1,2,3,4,5};
    int step=3;
    int len=5;
    shift(a,step,len);
    return 0;
}

 

这个也不算难。

 

## 5 编程:输入年月日,输出本日是这年的第几天,要求少于1000ms,内存小于256MB,例如输入2012,1,1 输出1。闰年规则:

1.能被4整除不能被100整除

2.能被400整除

任一即可。另外年份大于1小于3000,如果有错误输入,输出invalid paramter。

 


#include<vector>
#include <iostream>
#include <numeric>
void f(unsigned int y,unsigned int m,unsigned int  d)
{
    std::vector<unsigned int> n1{31,29,31,30,31,30,31,31,30,31,30,31} ;
    std::vector<unsigned int> n2{31,28,31,30,31,30,31,31,30,31,30,31} ;
    if (y==0 || y>3000 || m==0 || m>12 || d==0|| d>31)
    {
        std::cout<<"invalid parameter";
    }
    else
    {
        if (!(y%400) || (!(y%4) && (y%100)))
        {
            if (d>n1[m-1])
            {
                std::cout<<"invalid parameter";
            }
            else
            {
                std::cout<< std::accumulate(n1.begin(),n1.begin()+m-1,0)+d;
            }
        }
        else
        {
            if (d>n2[m-1])
            {
                std::cout<<"invalid parameter";
            }
            else
            {
                std::cout<< std::accumulate(n2.begin(),n2.begin()+m-1,0)+d;
            }
        }
    }

}
int main(int argc, char const *argv[])
{
    unsigned int y,m,d;
    char c;
    std::cin>>y>>c>>m>>c>>d;
    f(y,m,d);
    return 0;
}

 

这个代码有一定的应对错误输入的能力,但是很少,不过够用了。思路是先把闰年和平年的分别存成表格查询,这样减少判断的次数。

 

## 6.选择 

如果一个链表最常用的操作是在末尾插入节点和删除尾节点,选用哪种链表最省时间

A 单链表

B 带头节点的双向循环链表

C 带头节点的单向循环链表

 

如果是插入和删除尾节点都需要知道前驱节点,因为需要改前驱节点的next指针,单链表肯定不行。因为它查找前驱节点只能遍历查找,双向链表可以。

ps:头节点的好处:

  1. 处理起来方便。例如,对在第一元素结点前插入结点和删除第一结点操作与其他结点的操作就统一了。
  2. 无论链表是否为空,其头指针是指向头结点的非空指针,因此空表和非空表的处理也就统一了。

 

 

## 7剩下还有一些逻辑推理题。

 

## 8,填空题,已知二叉树的后序遍历和中序遍历求前序遍历。

 

这部分以前没接触过。

 

二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。

在二叉树的遍历中存在三种较为常用的遍历方式:前序遍历、中序遍历、后序遍历。

前序遍历的顺序是根节点,左子树,右子树,一般是递归遍历。中序是左根右,后序是左右根。

 

 这个递归比较好看的。

 

中序遍历顺序 左->根->右:ebadf。

 

一棵空树,或者是具有下列性质的二叉树:

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

(3)左、右子树也分别为二叉排序树;

(4)没有键值相等的结点。

显然是左根右,中序。

 

前:ABDGCEF

中:DBGAECF

 

 

如何找根节点,前后序遍历都很好找。

中:CDBAEFG

题目解析:

1,先序遍历的第一个节点肯定是根节点,所以A为该二叉树的根节点。

2,中序遍历中根节点左侧的节点全是根节点左子树的节点,根节点右侧的节点全是根节点的右子树。所以我们可以分成 DCB(左) | A(根) | EFG(右)。

3,递归使用上述两个步骤,可以画出整个二叉树。

 

 

接着,铭记总的方针

1. 找到根节点,确定左子树,确定右子树 (最重要)

2. 对左子树进行递归分析

3.对右子树进行递归分析


一、已知先序、中序遍历,求后序遍历

例:

先序遍历:         GDAFEMHZ

中序遍历:         ADEFGHMZ

思路分析:

1. 根据先序遍历的特点——中左右,第一个元素一定是根节点,所以立刻确定G是根节点。

2. 既然确定了G是根节点,再根据中序遍历的特点——左中右,在根节点G之前的ADEF就是左子树,根节点G之后的HMZ就是右子树。

3.接着分析左子树(思路和第1,2步一样)。把左子树的所有元素(即ADEF这四个元素)在先序遍历和中序遍历中的顺序拿出来进行比较。

先序的顺序是DAFE(中左右),中序遍历是ADEF(左中右)。

通过先序特点得出D是左子树的节点,通过中序特点确定唯一一个在D左边的A是左子树中的左叶子,右边的是EF。

观察EF的相对位置,在先序(中左右)是FE,在中序(左中右)EF,所以得出EF的关系是左中。

到此得出左子树的形状

 

 

4.接着分析右子树(思路和第1,2步一样),把右子树的元素(HMZ)在先序遍历和中序遍历中的顺序拿出来进行比较。

先序的顺序是MHZ(中左右),中序遍历是HMZ(左中右)。

根据先序遍历的特点确定M是右子树的节点,根据中序遍历的特点确定H是左叶,Z是右叶。

所以右子树的形状

 

5.于是得出了整棵树的形状

 

那么后序遍历就是AEFDHZMG


二、已知中序和后序遍历,求前序遍历

中序遍历:       ADEFGHMZ

后序遍历:       AEFDHZMG

思路分析:(记住方针是一样的)

1.根据后序遍历的特点(左右中),根节点在结尾,确定G是根节点。根据中序遍历的特点(左中右),确定ADEF组成左子树,HMZ组成右子树。

2.分析左子树。ADEF这四个元素在后序遍历(左右中)中的顺序是AEFD,在中序遍历(左中右)中的顺序是ADEF。根据后序遍历(左右中)的特点确定D是左子树的节点,根据中序遍历(左中右)的特点发现A在D前面,所以A是左子树的左叶子,EF则是左子树的右分枝。

EF在后序(左右中)和中序(左中右)的相对位置是一样的,所以EF关系是左右或者左中,排除左右关系(缺乏节点),所以EF关系是左中。

到此得出左子树的形状 

 

3. 分析右子树。HMZ这三个元素在中序遍历(左中右)的顺序是HMZ,在后序遍历(左右中)的顺序是HZM。根据后序遍历(左右中)的特点,M在尾部,即M是右子树的节点。再根据中序遍历(左中右)的特点,确定H(M的前面)是右子树的左叶子,Z(M的后面)是右子树的右叶子。

所以右子树的形状 

 

4. 最后得出整棵树的形状

 

那么先序遍历就是GDAFEMHZ .


三、已知前序、后序遍历,求中序遍历

这种情况,可能无法还原出唯一的二叉树,因为无法唯一确定根节点的左右子树。

 

## 还有:


#include<vector>
#include <iostream>

int main(int argc, char const *argv[])
{
    std::cout<<int(double(3/2)+0.9);   

    return 0;
}

 

这个输出的是1。因为3/2是整除,int是截尾取整,直接舍弃小数点后的。

 

## 总结

其实不算很难,但是自己的熟练度不够,第一次笔试慌乱,答得不好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

某公司算法岗笔试题(部分) 的相关文章

  • systemctl 启动/停止/重新加载 nginx

    systemctl 启动 停止 重新加载 nginx 一 新建nginx service脚本 span class token function sudo span span class token function vim span us
  • Unable to determine application id: com.android.tools.idea.run.ApkProvisionException: ERROR: APK pat

    Unable to determine application id com android tools idea run ApkProvisionException ERROR APK path is not specified for
  • Java获取文件的MD5

    Java获取文件的MD5 主要是通过读取文件的字符流 xff0c 然后赋值给MessageDigest对象 xff0c 最后将文件流转换成16进制的字符串 span class token keyword import span span
  • android整合好视通sdk经验总结(二)

    一 无法正常访问好视通服务接口 当按照android整合好视通sdk经验总结 xff08 一 xff09 步骤整合完毕后 xff0c 在这里修改申请的应用id和服务地址 修改完毕后运行发现无法正常初始化sdk xff0c 错误码30 xff
  • 视觉SLAM⑤--相机与图像

    目录 5 0 本章简介 5 1 相机模型 5 1 1针孔相机模型 5 1 2 畸变模型 5 1 3 双目相机模型 5 1 4 RGB D相机模型 5 2 图像 5 3 实践 xff1a 计算机中的图像 5 3 1 OpenCV的基本使用方法
  • 视觉SLAM⑩后端Ⅱ(滑动窗口滤波和优化与位姿图)

    目录 10 0 本章概述 10 1 滑动窗口滤波和优化 10 1 1 实际环境下的BA结构 10 1 2 滑动窗口法 10 2 位姿图 10 2 1 位姿图的意义 10 2 2位姿图的优化 10 3 非线性优化整体总结 xff1a 前端 后
  • 学习C++:C++进阶(五)CMake应用篇---集成第三方库和依赖管理

    目录 第二部分 xff1a 实用 CMake xff08 Practical CMake Getting Your Hands Dirty with CMake xff09 3 0 集成第三方库和依赖管理 xff08 Integrating
  • 2.ORB-SLAM2改进版本--稠密建图版本解析

    目录 1 修改思路 2 基本概念 nbsp 2 1 统计滤波 2 2 体素滤波
  • FreeRTOS 的命名规则

    初学 FreeRTOS 的用户对其变量和函数的命名比较迷惑 xff0c 下面专门做一下介绍 xff1a 变量 uint32 t 定义的变量都加上前缀 ul u 代表 unsigned 无符号 xff0c l 代表 long 长整型 uint
  • 【单目测距和双目测距比较】

    单目测距和双目测距比较 单 双目方案的优势与难点单目测距双目测距 双目测距实现步骤实现过程 单 双目方案的优势与难点 单目测距 优点 xff1a 单目的优势在于成本较低 xff0c 对计算资源的要求不高 xff0c 系统结构相对简单 缺点
  • ROS学习笔记(3):添加第三方依赖库

    最近在工控机上加入CAN卡 xff0c 想利用CAN卡来做为数据收发 现在在工程中加入CAN卡的头文件和自己做的cpp文档 已经申明了 函数 xff0c 但是还是会出现上图所示的错误 xff0c 经过一晚上的战斗算是搞清楚了 感谢 64 头
  • Java面试题及答案2019版(上)

    1 面向对象的特征有哪些方面 xff1f 答 xff1a 面向对象的特征主要有以下几个方面 xff1a 抽象 xff1a 抽象是将一类对象的共同特征总结出来构造类的过程 xff0c 包括数据抽象和行为抽象两方面 抽象只关注对象有哪些属性和行
  • git到远程出现的一些问题以及解决方法

    我们首先回顾一下 git reset命令 xff1a 1 git reset mixed xff1a 此为默认方式 xff0c 等同于不带任何参数的git reset 2 git reset soft 回退到某个版本 xff0c 只回退了c
  • CMakeLists.txt 和 package.xml 重要内容详解

    边学边看 xff0c 学到什么分享什么 CMakeLists txt 构建配置文件package xml 功能包配置文件 上面的意思个人理解就是功能包本身如果要在别处运行 xff0c 需要什么样的条件在xml文件中看 功能包自身 xff0c
  • Docker运行Prometheus(普罗米修斯)

    1 编辑yaml格式 xff0c 进行自我监控 mkdir etc prometheus cd etc prometheus vi etc prometheus prometheus yml global scrape interval 1
  • Kubernetes(k8s)安装Dashboard(控制面板)

    参考文章 xff1a https www jianshu com p f7ebd54ed0d1 1 默认情况下不会部署 Dashboard xff0c 可以通过以下命令部署 xff1a kubectl apply f https raw g
  • 航模无刷电机常见参数

    1 xff0c KV值 xff1a 表示电机运行速度的指标 xff0c 电机转速 61 KV值 x 工作电压 2 xff0c 空载电流 xff1a 指电机不带负载 xff08 螺旋桨等 xff09 时的额定工作电流 3 xff0c 电阻 x
  • RealSense D435i深度相机介绍

    文章目录 D435i硬件结构及各个组件原理详解前言一 硬件参数信息二 视觉处理器D4三 深度模块四 红外投影仪 Infrared Projector 五 彩色图像信号处理机 ISP 六 IMU D435i硬件结构及各个组件原理详解 前言 R
  • Ubuntu20.04下安装intel Realsense SDK

    1 安装安装依赖项 sudo apt span class token operator span get install libudev span class token operator span dev pkg span class

随机推荐

  • MiniFly的学习经历

    MiniFly的学习经历 基于MiniFly的无人机编队系统一台遥控器同步控制多台无人机无线通讯方面遥控代码部分无人机通信代码部分 一台遥控器分布控制多台无人机无人机控制部分 使用电脑的串口上位机控制无人机遥控串口通信接收指令指令设计 基于
  • 【NOJ1044】【算法实验三】【BFS_分支限界】独轮车

    1044 独轮车 时限 xff1a 1000ms 内存限制 xff1a 10000K 总时限 xff1a 3000ms 描述 独轮车的轮子上有红 黄 蓝 白 绿 xff08 依顺时针序 xff09 5种颜色 在一个如下图所示的20 20的迷
  • 【杭电100题】2073 无限的路

    题目链接 xff1a http acm hdu edu cn showproblem php pid 61 2073 xff08 c语言的double类型printf lf 显示0 00000问题 xff09 xff1a https blo
  • 【杭电100题】2094 产生冠军

    原题 xff1a http acm hdu edu cn showproblem php pid 61 2094 最近很喜欢用map 把成功者 失败者都存起来 然后在成功者里把曾经失败的划掉 最后成功者里如果只剩一个人 xff0c 冠军产生
  • docker命令详解

    镜像下载 搜索镜像docker search 43 镜像名字 docker search centos 从Docker Hub中搜索符合条件的镜像 下载镜像 docker pull 43 镜像名字 docker pull centos 查看
  • uCos中的信号量机制

    文章目录 1 背景2 概述2 1 主要机制及应用2 2 同步或通信的基本方式 3 信号量3 1 主要机制及应用3 2 分类3 3 互斥信号量3 3 1 嵌套 递归 资源访问3 3 2 删除安全 3 4 各种互斥机制的比较3 5 二值信号量3
  • opencv里的几种图像数据格式(CV_8UC3,CV_32FC3,CV_64FC3等)

    opencv里的几种图像数据格式 xff08 CV 8UC3 xff0c CV 32FC3 xff0c CV 64FC3等 xff09 参考 xff1a https blog csdn net qq 29540745 article det
  • android:使用audiotrack 类播放wav文件

    参考 xff1a http mindtherobot com blog 624 android audio play an mp3 file on an audiotrack http baike baidu com view 14471
  • 逆变电路

    逆变的概念 与整流相对应 xff0c 直流电 变成 交流电 交流侧接电网 xff0c 为 有源逆变 交流侧接负载 xff0c 为 无源逆变 xff0c 本章主要讲述无源逆变 逆变与变频 变频电路 xff1a 分为 交交变频 和 交直交变频
  • windows找不到树莓派IP地址

    树莓派用网线连接电脑 xff0c 第一次正常 xff0c 而第二次用arp a找不到树莓派的地址 xff0c 网上查资料 xff0c 网络共享关闭再重新打开依旧找不到 xff0c 后来发现网络处以太网一直显示正在识别 xff0c 把以太网禁
  • unity报错NullReferenceException: Object reference not set to an instance of an object

    在做unity3d的UDP通信时 xff0c 遇到了该的错误 之前初始化用的Start xff0c 运行正常 xff0c 某天突然报错 xff0c 后面看到了文章 https blog csdn net u011185231 article
  • Unity3D UDP通信

    补一下前面遇到的问题 最近在做树莓派与Unity3D的UDP通信 xff0c 树莓派通过网线连接电脑 xff0c 设置网络共享 树莓派作为客户端 xff08 python xff09 xff0c Unity3D作为服务端 xff08 C x
  • ROS机械臂模型的调试

    用传感器串口输出数据控制虚拟机ROS中的6DOF机械臂模型 xff08 每次重新调试都需要一定的时间熟悉过程 xff0c 所以记录一下 不记录代码只记录调试过程 xff09 串口配置 传感器通过USB转TTL模块接到电脑 xff0c 在虚拟
  • openrave

    配置IKFAST求解器 xff0c 装openrave装了一天终于在差三分钟十一点的时候出来了界面 ubuntu18的boost默认1 65 xff0c 但是好像和openrave不匹配 xff0c 换成了1 58 如果后续使用没问题就来详
  • ROS1代码转ROS2

    先占个坑 xff0c 等我做完写总结
  • 四元数基本概念&&四元数3D旋转(求两个四元数的夹角)

    四元数基本概念 1 四元数定义向量形式 xff1a 模长 xff1a 2 四元数加减法 3 四元数的逆和共轭 当q是单位四元数时 xff0c 4 四元数乘法4 1 标量乘法 xff1b 标量s 四元数与标量相乘满足乘法交换律 xff1a 4
  • 树莓派安装64bit系统并安装miniconda

    树莓派安装64bit系统并安装miniconda 某机械臂只有arm64的动态链接库 xff0c 所以如题 中间过程无比曲折 xff0c 记录一下 1 安装64bit系统 1 1 下载系统 树莓派系统官网 xff1a https www r
  • 四旋翼无人机学习第23节--原理图与PCB库开源计划

    在之前的教程中 xff0c 我们学到了原理图和PCB库的绘制方法 xff0c 了解了绘制的基本方法 在之后的学习中 xff0c 我打算从头开源自己的原理图和PCB库 不定期更新 xff0c 方便大家快速的进行PCB设计 这里有几点想要说明
  • 基于openmv的无人机Apriltag动态追踪降落完整项目资料(labview+openmv+apriltag+正点原子四轴)

    前言 xff1a 之前假期做的一个小项目 xff0c 炸了好几套桨叶233 xff0c 分享出来希望能帮助更多人快速学习 使用正点原子ATK MiniFly 飞行器二次开发多旋翼Apriltag追踪 xff1b 使用LABVIEW自主设计地
  • 某公司算法岗笔试题(部分)

    今天参加了第一次笔试 xff0c 准备的不是很好 xff0c 分享几道题 1 选择题 xff1a int i 61 1 const int j 61 1 下列错误的是 xff1a const int p1 61 amp i const in