百度 提前批 测开面经一面汇总

百度 提前批 测开面经(已意向)

  1. 7.28 一面
    自我介绍
    项目中遇到的困难 怎么解决
    手撕代码 字符串单词首字母大写

#include<iostream>

#include<cstring>

using namespace std; 

int main(){

string str;

getline(cin,str);

for(int i = 0; i < str.size(); i++){

if(str[0] >= 'a' && str[0] <= 'z') str[0] -= 32;

if(str[i-1] == ' ' && str[i] >= 'a' && str[i] <= 'z')

str[i] -= 32;

}

int p;

for(int i = 0;i < str.size(); i++){

if(str[i]!=' '){

p = i;

break;

}

}

for(int i = p;i < str.size(); i++){

if(str[i]==' ' && str[i+1]== ' '){

continue;

}

cout<<str[i];

}

return 0;

}


  1. 怎么看待测开

测试开发工程师

一、任务:

顾名思义,该岗位既要懂测试又要懂开发。它是一个集开发和质量意识于一身的角色。需要有开发人员的技能和测试人员的思维,会参与单元测试代码编写、业务代码评审、测试工具开发、测试平台开发、框架开发。

二、选择测开的原因:

2.周边的同学基本都是做开发或者算法,所以通过他们了解了一些关于开发和算法岗的情况。经过认真思考,根据自己之前的工作经验和自身特点,选择了测开这个岗位,后来自己也去了解了一些测开的知识,我觉得相对于开发岗或者算法岗,做测试这个工作更让我有成就感一些,我本身也挺喜欢测开这个工作模式。因为现在客户对产品的质量越来越高,所以对产品的测试也越来越重要,比如性能测试和安全测试。因为测开这个岗位需要了解的东西很多,前端、开发、算法都需要了解一些。因此如果需要转岗的话,测开也是比较好转的,面对实习工作,我也想有更有可能性一些,不想一开始就把自己定位到某一个岗位上,我也想多学习,多了解一些知识。

三、对测开的职业认识

具有测试能力的基础上兼备开发能力;另一方面自动化测试成为趋势,利用开发的技巧解决测试中的问题以提高测试效率。测试开发工程在公司一般有两种,一种是单纯为测试团队开发测试工具或者系统。另一种就是在测试过程中发挥主观能动,利用自动化把重复劳动降至最低,比如开发适用于特定场景的测试工具、测试脚本和测试用例。

·如何测试一个输入手机号的页面

https://blog.csdn.net/weixin_47197994/article/details/116661417
·c++回收机制,以及使用的内存管理的命令

程序占用的内存分为 栈区、堆区、全局区(静态区)、文字常量区、程序代码区。

重点以下两个:

1、栈区(stack) 此区域由编译器自动释放。

2、堆区(heap) 一般由程序员手动释放。若是没有释放,程序结束时可能由OS操作系统回收。

全局变量和静态变量存放在DATA段,未初始化的全局变量和静态变量存放在BBS段。BBS段特点:在程序执行前BBS段自动清零,所以未初始化的全局变量和静态变量在程序执行前已经成为0.

文字常量区:存放常量,而且不允许修改。程序结束后由系统释放。

程序代码区:存放程序的二进制代码。

1️⃣ malloc和free是函数,new和delete是操作符

2️⃣ malloc申请的空间不会初始化,new可以初始化

3️⃣ malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可,如果是多个对象,[]中指定对象个数即可

4️⃣ malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型

5️⃣ malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常

申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理


·虚函数

虚函数(Virtual Function)是一种在面向对象编程中经常使用的概念。它允许在基类中定义一个函数,在派生类中进行重写,并在运行时根据对象的实际类型调用正确的函数实现。

在C++中,通过使用关键字"virtual"来声明虚函数。虚函数可以通过继承关系进行覆盖重写,当通过基类的指针或引用调用虚函数时,会根据实际对象类型调用正确的函数版本。

以下是一个示例代码:

#include<iostream>

using namespace std;

 

// 基类

class Base {

public:

    virtual void func() {

        cout << "Base::func() called" << endl;

    }

};

 

// 派生类

class Derived : public Base {

public:

    void func() {

        cout << "Derived::func() called" << endl;

    }

};

 

int main() {

    Base* b = new Derived();  // 创建一个派生类对象,并将其赋值给基类指针

    b->func();  // 通过基类指针调用虚函数

 

    delete b;  // 释放内存

 

    return 0;

}

输出结果:

Derived::func() called

在上述代码中,我们定义了一个基类Base和一个派生类Derived。在基类中,我们声明了一个虚函数func()。派生类Derived重写了这个虚函数。

在主函数中,我们创建一个派生类对象,并将其赋值给基类指针b。接着通过该指针调用虚函数func(),由于多态的特性,最终调用的是Derived类中的重写函数。

这就是虚函数的基本概念和用法。通过使用虚函数,我们可以实现多态性,提供了更好的灵活性和扩展性。


·口述思路 两个数字 不用额外空间进行交换

异或运算。(注:c语言中异或操作用^符号表示)

异或操作的特性:

1、一个数与本身异恒等于0,如5^5=0;

2、一个数与0异或恒等于本身,如5^0=5;

3、异或操作满足交换律,如1^2^3=2^1^3;

下面就利用这两个特性推导一下交换公式。

1、a=a^0=a^(b^b)=b^(a^b);

2、b=b^0=b^(a^a)=a^(a^b)=b^(a^b)^(a^b);

这样推导的原因是,后面可以利用a存下a,b二者的信息(a^b),然后与b进行异或操作后分别得到a、b,改变赋值对象就可以实现变量交换。

实现代码:(注解中的a,b均代表未交换前的a,b)

a=a^b;//   =a^b

b=b^a;//  =b^(a^b)=a^(b^b)=a^0

a=b^a;   // =b^(a^b)^(a^b)


·数据库事务四大特性

事务:是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元);

事务的四大特性:

原子性(Atomicity):事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。隔离型(Isolation):一个事务的执行不能被其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。持久性(Durability):指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。个人认为这四大特性总结起来就是两种:

可靠性:原子性、一致性、持久性可以归纳为可靠性。可靠就是要保证数据的一致与不丢失。数据库要保证数据的一致,就要处理commit与rollBack;显然处理commit指令的时候需要记录要提交哪些数据,rollback的时候需要知道回退的原数据。mysql中commit需要redo log,rollBack 对应undo log

并发控制(隔离性):当多个并发请求过来,并且其中有一个请求是对数据修改操作的时候会有影响,为了避免读到脏数据,所以需要对事务之间的读写进行隔离,至于隔离到啥程度得看业务系统的场景了,实现这个就得用MySQL 的隔离级别
·数据库 查询姓名包含张三的记录,查询前十条记录


·Linux 常用命令

https://www.wangan.com/wenda/4462

·输入url页面的反应过程

https://www.ngui.cc/el/3509597.html?action=onClick

·快排的时间复杂度,最坏情况,以及基本思路

https://blog.csdn.net/lmdanran/article/details/129024078

·反问


最后面试官说主要可能需要用Java 然后Linux平台 所以Linux上稍微欠缺


7.29 二面
自我介绍
项目的简单提问介绍
·c++内存管理

C++内存管理主要涉及以下几个方面:

栈内存管理:

C++中,函数内部声明的局部变量会分配在栈上,函数执行结束后会自动释放。栈内存的管理由编译器自动完成,无需手动管理。

堆内存管理:

在C++中,使用new运算符来在堆上分配内存,使用delete运算符来释放已分配的内存。当使用new分配内存后,必须确保使用delete释放内存,否则会导致内存泄漏。

示例代码:

int* ptr = new int; // 在堆上分配内存

*ptr = 10; // 对内存进行操作

delete ptr; // 释放内存

指针管理:

在C++中,使用指针来管理动态分配的内存。当使用new分配内存后,将地址存储在指针中,然后可以通过指针对内存进行操作。在不再需要使用内存时,需要手动调用delete释放内存,避免内存泄漏。

示例代码:

int* ptr = new int; // 在堆上分配内存

*ptr = 10; // 对内存进行操作

delete ptr; // 释放内存

 

ptr = nullptr; // 将指针置为空,避免成为悬空指针

内存泄漏问题:

在使用动态分配内存时,需要注意及时释放内存,避免内存泄漏。当分配的内存没有被释放,无法再次使用时,即发生了内存泄漏。

示例代码:

void func() {

    int* ptr = new int; // 在堆上分配内存

    *ptr = 10; // 对内存进行操作

    // 没有调用delete释放内存,发生了内存泄漏

}

总结:C++内存管理涉及栈内存和堆内存的管理,对于动态分配的内存,需要手动调用delete释放内存,避免内存泄漏。同时,使用指针来管理分配的内存,需要注意指针的操作,避免成为悬空指针。


·c++面向对象的理解

面向对象

概念:面向对象则是一种以对象为中心的编程思想,就是通过分析问题,分解出一个一个的对象,然后通过不同对象之间的调用来组合解决问题。建立对象的目的不是为了完成某个步骤,而是为了描述某个事物在解决整个问题的过程中的行为。

如上面的例子,汽车发动、汽车熄火,对于面向对象而言,我们则关心的是汽车这类对象,两个事件只是这类对象所具备的行为。

优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护

缺点:一般来说性能比面向过程低

封装

将一类事物的属性和行为抽象为一个类,隐藏信息,留有公开接口访问操作,提高数据的隐蔽性的同时,使代码模块化,复用性更高。

封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式

简单的来说就是我将不想给别人看的数据,以及别人无需知道的内部细节, “锁起来” ,我们只留下一些入口,使其与外部发生联系。

好处

隐藏实现细节,提供公共的访问方式

提高了代码的复用性

继承

公共行为和属性抽象为一个父类,每一个子类都是一个特殊的父类,有父类的属性和方法,也有自己的属性和方法。进一步的提高了代码的复用性

优点

提高了代码的复用性,提高了代码的维护性(通过少量的修改,满足不断变化的具体要求),让类与类产生了一个关系,是多态的前提。

缺点

但是缺点也很显著:让类的耦合性增强,这样某个类的改变就会影响其他和该类相关的类。

多态

父类的引用变量可以指向任何一个子类的引用变量(向上转型)。
多态是同一个行为具有多个不同表现形式或形态的能力。
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。

多态的构成条件

  1. 必须通过基类的指针或者引用调用虚函数

虚函数:在类的普通成员函数前加上virtual关键字

  1. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写

·百度搜索引擎和其他搜索引擎的区别

百度:有数据显示,百度占据了68%的中国搜索引擎市场。在文本信息搜索方面,百度明显在搜索中文(特指汉语)文本时更加有效。这是因为百度的搜索引擎算法经过专门的调校,去优化中文的搜索(这大概也是为什么百度自称是“全球最大的中文搜索引擎”)。同时,百度搜索引擎收录了更多的中文网站,以及百度旗下的百家号等资源。这些独有的资源更加巩固了百度搜索引擎在中文互联网的地位。


手撕代码 字符串 单词反转

class Solution {

public:

    string reverseWords(string s) {

        // 反转整个字符串

        reverse(s.begin(), s.end());

        int n = s.size();

        int idx = 0;

        for (int start = 0; start < n; ++start) {

            if (s[start] != ' ') {

                // 填一个空白字符然后将idx移动到下一个单词的开头位置

                if (idx != 0) s[idx++] = ' ';

                // 循环遍历至单词的末尾

                int end = start;

                while (end < n && s[end] != ' ') s[idx++] = s[end++];

                // 反转整个单词

                reverse(s.begin() + idx - (end - start), s.begin() + idx);

                // 更新start,去找下一个单词

                start = end;

            }

        }

        s.erase(s.begin() + idx, s.end());

        return s;

}};


·对于服务器端的测试需要关注什么点
https://blog.csdn.net/m0_46612488/article/details/115689428
·tob 和 toc 需要关注哪些点

https://blog.csdn.net/xuexueyaa/article/details/120433715
然后一些发散性的发问吧 记不太清了

8.9 三面
自我介绍
项目介绍以及提问
计网:微信两个用户发消息会经过哪些层,这些层分别干了什么

https://blog.csdn.net/m0_73303597/article/details/127585211
·数据结构:如何优化快排

https://www.acwing.com/file_system/file/content/whole/index/content/2415236/
·算法:两个栈实现一个队列,跳台阶

class CQueue {

private:

    stack<int> inStack, outStack;

    void in2out() {

        while (!inStack.empty()) {

            outStack.push(inStack.top());

            inStack.pop();

        }

    }

public:

    CQueue() {}

    void appendTail(int value) {

        inStack.push(value);

    }

    int deleteHead() {

        if (outStack.empty()) {

            if (inStack.empty()) {

                return -1;

            }

            in2out();

        }

        int value = outStack.top();

        outStack.pop();

        return value;

    }

};

//跳台阶

class Solution {

public:

    int climbStairs(int n) {

        int MOD = 1000000007;

        int f1 = 0, f2 = 0, f3 = 1;

        for (int i = 1; i <= n; ++i) {

            f1 = f2;

            f2 = f3;

            f3 = (f1 + f2) % MOD;

        }

        return f3;

    }

};
·智力题:海盗分金币,赛马

https://interviewguide.cn/notes/03-hunting_job/02-interview/06-intelligence.html#_13、
闲聊:工作地点的选择,职位的选择,目前有无接触其他公司
反问
(可能还要其他问题记不清了)
据说提前批第二批是这个月底出结果

8.11 三面again
(前景提要:前一个三面是成都的团队,成都那边好像主要是交付工作,那个团队认为我工程量较少,所以hr让我再次选择城

市,选择了深圳)
自我介绍
·对测试的理解

一、 测试在项目中的定位和测试的理念

1、 测试是要贯穿整个项目周期的,是项目经理的有利助手,项目经理和测试经理应该是类似于部队军团长和政委之间的关系,相辅相成的。;

2、 测试经理不应是单纯的发现系统存在的缺陷,而是应该对项目风险(比如有风险的程序模块、项目进度风险等)有提醒预警的义务和责任。

3、 测试和项目经理的最终目标是一致的,但是测试在原则上是不能允许测试未完成或者遗漏缺陷上线的,如出现此情况应该由项目经理申请经高层领导决策是否上线
·对开发,测试开发,测试的理解

https://blog.csdn.net/weixin_30847939/article/details/97455716

对开发和测试开发的看法

https://zhuanlan.zhihu.com/p/599375039
为什么选择这个岗位,城市

1、为什么要做测开?

职业没有贵贱之分只有合不合适这一说法。至于为什么会选择测开,还是针对自身的特质来决定的。

首先肯定是兴趣,我对任何事物都会产生一种逆向思维,好奇心很强,喜欢去探索一下该事务通常情况下不会去考虑到的问题。

其次,我喜欢与人交往,沟通能力也不算太差。作为测试人员,可以获得不仅仅是同行和开发人员,还有和客户讨论有关领域知识的更多信息的机会。

喜欢成为一个提供优质产品的团队。做好产品交付的最后最后的严格把关,有较强的责任感

、北京、上海、广州、深圳

这四个超一线城市想必大家都不陌生了,北上广深在某一种程度上可以说是经济繁荣的代名词,这四个城市都是国家大力发展的超一线城市,并且国家会对IT这类新兴产业进行政策扶持,整个IT行业的发展前景是很值得期待的。并且这类超一线城市的迅猛发展离不开人才支撑,因此在北上广深中,不乏有互联网大厂对年轻人才递出橄榄枝。根据20年的年终数据显示,北上广深工资排行榜中,IT行业靠着人均1.5w薪酬稳居第一,高薪酬&高压力并重的超一线城市,适合业务能力出众的IT从业者发展
·撕了一道算法题(提问自己设计测试案例会怎么设计)

https://blog.csdn.net/weixin_60358891/article/details/130608467
测试一个软件需要考虑哪些方面

1、数据和数据库完整性测试:数据与数据库完整测试是指测试关系型数据库完整性原则以及数据合理性测试。

2、白盒测试:通过阅读程序代码或者通过使用开发工具中的单步调试来判断软件的质量。

3、功能测试:测试软件各个功能模块是否正确,逻辑是否正确。

4、UI测试:测试用户界面的风格是否满足客户要求,比如文字、图片、背景等。

5、性能测试:也就是测试软件的质量,比如负载测试,强度测试,数据库容量测试等。

6、安全性和访问控制测试:软件程序的安全级别,系统的安全级别。

7、故障转移和恢复测试:当主机软硬件发生灾难时候,备份机器是否能够正常启动的测试。

8、兼容性测试:也就是配置测试,测试对象在不同的软件和硬件配置中的运行情况。
(还有一些问题吧,总的来说是比较发散的一些问题,可能在考量综合能力,然后自己感觉有些问题回答的不是很好,也没有录音呜呜呜,但是还是希望能通过吧,球球了!孩子心好累)
据说后续会有测评,测评通过会有HR联系,然后预计月底offer

 

牛客81482577号

2020-08-19 13:33

小米_信息技术部_测试开发工程师

关注

百度提前批测开一面面经

前天通知的一面,时间约的是今天11:00,早上8点就来了短信提醒,让在如流添加联系人。11:00准时开始,面试官小哥哥真的炒鸡温柔,会根据自己的介绍慢慢引导,然后展开提问,问题也是一直在循序渐进。

1、上来先让自我介绍了一下,然后通过自我介绍引出了我的实习

2、介绍一下实习的两个项目,做了哪些工作

c++部分

  1. c++里关于内存存储这部分介绍一下:

https://blog.csdn.net/yandong666/article/details/128064174

(我反问了一下,是存储区域的划分吗,然后面试官说是的,接着我就介绍了一下存储区的划分,然后讲到了堆这块,说是new或者malloc开辟的空间)

  1. 接着我上面的问题问了一下,new和malloc的区别,以及析构函数是怎么运用的 ,作用是什么?

new和malloc的区别:https://www.cnblogs.com/ludai/p/malloc_vs_new.html

析构函数:https://blog.csdn.net/qq_33757398/article/details/81335974

  1. 还问了一个c++ 里的 core??这个我不是很懂,直说不是特别了解

应用崩溃会生成core dump文件

6、深拷贝浅拷贝之间的区别

(这里我就简单说了一下浅拷贝是对指针的拷贝,深拷贝不仅对指针拷贝还拷贝了里面的内容)

深拷贝和浅拷贝的区别:浅拷贝主要是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝需要不但对指针进行拷贝,并对指针指向的内容进行拷贝,经过深拷贝后的指针是指向两个不同地址的指针。

·手撕代码1:求输入字符串是不是回文串

class Solution {

public:

    bool isPalindrome(string s) {

        int i = 0;

        int j = s.size() - 1;

        while (i < j) {

  • //isalnum : 判断一个字符是否表示数字或者字母,如果是则返回true,否则返回false;

            if (!isalnum(s[i])) {

                i++;

            }

            else if (!isalnum(s[j])) {

                j--;

            }

  • //tolower : 若字符为字母则转化为小写字母;

            else {

                if (tolower(s[i]) != tolower(s[j])) {

                    return false;

                }

                else {

                    i++;

                    j--;

                }

            } 

        }

        return true;

    } 

};

然后针对这个题目问了一下,如果设计测试用例应该怎么设计(我大致说了几种边界条件的情况........)

https://blog.csdn.net/m0_64509235/article/details/121984589?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169321447516800227417101%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=169321447516800227417101&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-2-121984589-null-null.142^v93^chatgptT3_1&utm_term=测试用例设计方法&spm=1018.2226.3001.4187

手撕代码2:求一个数是不是等于它的所有因数之和,称这样的数为“完数”,求1000以内的完数。

源程序如下:

#include <stdio.h>

void main()

{

int i,j,sum;

for(i=3;i<=1000;i++)

{

sum=1;

  for(j=2;j<i;j++)

  {

    if(i%j==0)

{

sum+=j;

}

  }

  if(sum==i)

  {

  printf("%d\n",sum);

  }

}

}

数据库部分

7、你用什么数据库,对数据库这块了解多少

(我说我就了解基本的建表、增删改查,以及三大范式)

8、MySQL join 这块了解吗

(介绍了一下内部联结和左右联结)

https://blog.csdn.net/HellowWord_/article/details/121313985

9、用一条SQL语句,从一个tb1(name,class,score)中找出(class,passNum,failNum),就是从一个成绩表中,找出每个班对应的及格人数与不及格人数

(。。。很尴尬这个我没写出来..不过面试官很有耐心的跟我解释说要用到case when)

selet class 班级 

sum(case when score >60 then 1 else 0 end) as 及格人数,

sum(case when socre <60 then 1 else 0 end) as 不及格人数

from score GROUP BY class;

 

10、问几种排序算法了解哪些

(我说了冒泡、选择、插入、归并、快排这几个是我比较熟的),然后就,手撕了一个快排算法。

void quicksort(int arr[], int left, int right) //快排

{

//保存当前left,right位置

int L = left;

int R = right;

//用第一个元素作为基点

int privot = arr[L];

while (L < R)

{

while (L < R && arr[R] >= privot)

{

R--; //5,6,8,1,4,3,9,2,7,10

}

while (L < R && arr[L] <= privot)

{

L++;

 

}

//如果L指向的元素大于R指向的元素就交换他们的值

if (arr[L] > arr[R])

{

int tmp = arr[L];

arr[L] = arr[R];

arr[R] = tmp;

}

}

//将L指向的值非起始位置

arr[left] = arr[L];

//在将privot的值放在L的位置

arr[L] = privot;

//以L为起点的地方到L-1的地方分为小堆

quicksort(arr, left, L-1);

//以L+1的地方到right分为大堆

quicksort(arr, L+1, right);

}

int main()

{

int arr[10] = { 5,6,8,1,4,3,9,2,7,10 };

int left = 0;

int right = sizeof(arr) / sizeof(arr[0])-1;

quicksort(arr, left, right);

int i = 0;

for (i = 0; i < 10; i++)

{

printf("%d", arr[i]);

}

}

反问环节

1、你们部门主要是做什么的? 

(好像主要是对一些插入广告的测试,也有一些开发工作) 

2、部门氛围听说很融洽对吗? 

3、作为在校学生的话,实际的测试开发经验还不是很多,要是想应聘测开,这一块是不是需要额外加强一下? 

4、今天我的总体面试情况?? 

总结:

总体来说问的问题都很基础,没有问操作系统和计算机网络这块,主要还是针对的C++和数据库,不过他们部门主要也是c++开发。总共面了70分钟左右,视频面,代码都是直接在本地编译器编写屏幕共享。实在写不出来的时候面试官会有提醒。最后问情况说总体好像还可以,但是算法部分还是需要加强.......最后,希望给一个二面机会啊!!,但是好像忘了问,二面主要会考察什么东西了。。。。。。


 

1、流程

1)自我介绍; 

2)技术提问; 

3)提问环节; 

2、提问

1)重载和重写? 

https://blog.csdn.net/qq_44257807/article/details/115601953

  1. 虚函数? 

https://blog.csdn.net/qq_46017342/article/details/131095648

  1. 快速排序思想,希尔排序思想(忘了T_T),归并排序思想,堆排序思想,四个时间复杂度都为; o(nlogn)

C++的排序_c++排序_wrdoct的博客-CSDN博客

希尔排序: 希尔排序详解 c++版_c++希尔排序_allAboutLaoWang的博客-CSDN博客

归并排序

堆排序:https://blog.csdn.net/m0_63033419/article/details/127644252

  1. cookie和session? 

session和cookie的区别与联系

两者的区别:在安全和性能方面考虑

1、cookie数据存放在客户端,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能,考虑性能应当使用cookie。

4、不同浏览器对cookie的数据大小限制不同,个数限制也不相同。单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

5、可以考虑将登陆信息等重要信息存放为session,不重要的信息可以放在cookie中。

两者的联系:

1、都是用来记录用户的信息,以便让服务器分辨不同的用户。

2、可以搭配使用,但都有自己的使用局限,要考虑到安全和性能的问题。

  1. 树中序遍历非递归?

 //中序遍历--非递归

void InOrder2(BiTree T){

SqStack s;

InitStack(s); //初始化栈

BiTree p=T,a; //遍历指针p

while(p||!StackEmpty(s)){

if(p){

Push(s,p);

p=p->lchild;

}

else{

GetTop(s); //在p出栈之前先查看

a=Pop(s,p); //出栈,a为接收出栈的p节点

p=p->rchild;

}

}

}

1.首先初始化栈s,我用的是顺序栈,有能力的同学可以尝试着用链栈。

2.创建工作指是针p和a,其中p指向树T,也就是p指向节点1。

3.进入循环(p不为空或者栈s不为空时)执行循环体:

做判断:如果工作指针p不为空,此时p指向的节点1进栈,

p继续指向左子树指向了节点2,

继续将2进栈,由于节点2没有左子树,所以进入else语句,

出栈之前输出节点值,那么此时输出的就是2,并将节点2弹出栈,

再寻找节点2的右节点,进入if语句,就这样不断迭代。

  1. 如何测试百度的搜索框?性能上? 

测试案例——测试百度搜索框

性能测试:
1.在网络情况良好的前提下,页面的跳转需要多长时间
2.在网络情况不好的前提下,页面的跳转需要多少时间
3.对搜索引擎进行加压测试
4.搜索页面打开的速度是否满足设计要求  
5.搜索出结果消耗的时间,是否满足设计要求

7)数据库会不? 

很久没用了... 

Q:给一个场景,如百度有很多用户,怎么优化查询呢?

https://www.modb.pro/db/530815 

建立索引,不知道了... 

Q:再比如,一个班级,怎么给班级学生按分数分组,并得到哪个组的人最多? 

用groupby分组,然后cunt统计,最后排序;

数据库好久好久没用,都忘光了T_T 

  1. 析构函数?

析构函数_深山里的小白羊的博客-CSDN博客

·TCP/UDP区别? 

TCP和UDP协议的区别

TCP是面向连接、保证传输的协议,而UDP是无连接的协议。

TCP传输数据稳定可靠,适用于对网络通讯质量要求较高的场景,需要准确无误的传输给对方,比如,传输文件,发送邮件,浏览网页等等。在传输数据前,双方会先建立一条虚拟的通道,可以减少数据传输差错。

UDP的优点是速度快,但是可能产生丢包,所以适用于对实时性要求较高但是对少量丢包并没有太大要求的场景。比如:域名查询,语音通话,视频直播等。在数据传输时,每个数据段都是一个独立的信息,包括完整的源地址和目的地,因此,数据能否被对方接收、数据到达的实践和内容的完整性有序性都无法得到保证。

以生活中常见的通讯为例:UDP协议就相当于是写信给对方,寄出去信件之后不能知道对方是否收到信件,信件内容是否完整,也不能得到及时反馈,而TCP协议就像是打电话,你需要知道对方的号码才能打电话,交流的内容可以实时反馈,确保信息的完整性。

  1. 三次握手过程? 

https://blog.csdn.net/longlyboyhe/article/details/122438744

11)介绍项目; 

实习期间的一个项目,说了很多,没组织好语言,有点乱,然后就结束了。 

还有好多不记得了... 

3、提问环节

1)你们部门主要负责的工作是偏向开发多一点还是测试多一点呢? 

主要意思:更多的是做一些开发一些自动化或者智能测试工具。 

2)你们主要使用的语言是什么? 

主要是Python,Java。 

3)多久反馈? 

一周内。 

4、总结

小姐姐全程态度超好,面试体验很好。 

终于有人问我C++了,好感动T_T; 

问题比较简单,还是要好好准备基础呀,数据库、网络、系统。

中二的加菲猫深藏功与名

08-23 16:35

电子科技大学 电子信息类

关注

提前批百度测开一面(北京)

1、自我介绍,然后让我讲一下张量的项目以及什么是张量(面试官还说他只听说过张亮麻辣烫)

2、手撕一个题,统计一篇文章中每个单词出现的次数

https://blog.csdn.net/YoyoHuzeyou/article/details/129637942。

  1. 手撕一个sql,查出tb_score表中数学成绩排在前10的学生的姓名和成绩

mysql查询成绩前10学生信息 - 老白网络

SELECT student_name, score FROM tb_score

WHERE subject = '数学'

ORDER BY score DESC LIMIT 10;

  1. 问了Linux命令,问我知道哪些,列出十条

Linux 常用命令有哪些 - 网安

pwd is cat mv cp 

sudo zip/unzip mkdir rmdir rm find

  1. 比如查看a.log文件最新的100条日志怎么写命令

tail -n 100 a.log

  1. 讲一下有哪些测试方法,对一个智能音箱怎么测试

https://blog.csdn.net/m0_64509235/article/details/121984589?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169321447516800227417101%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=169321447516800227417101&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-2-121984589-null-null.142^v93^chatgptT3_1&utm_term=测试用例设计方法&spm=1018.2226.3001.4187

https://it.sohu.com/a/713560423_120986878

  1. 为什么投我们测试开发岗位?

8、你大学和研究生期间最有成就感的事情

9、最后悔和遗憾的事情有吗?

全程27分钟,面完不到十分钟HR通知约二面

百度测试开发工程师一面 感觉凉凉,数据库的内容回答的不好 一共就面了30min

中途面试官还切断了视频。

1、自我介绍

2、问为什么选择测试,为什么不去做开发

 接触了测试相关的内容之后,觉得测试的普适性很好,有了一套完善的测试体系之后,可以测试不同的系统;

  而且测试的技能更新迭代相对开发较慢,不需要一直疲于奔命的学习,毕竟五年内我可以全身心投入到工作中,再往后就不能全部精力放在工作上了,所以觉得测试比较适合长期发展

  自己的一些开发技能,比如Java语言、SQL、Linux的操作也会对测试工作有帮助,尤其对自动化测试方向。

  测试的前景也不错,之前互联网产品解决了从无到有的问题,现在同类产品多了,质量就显得尤为重要,尤其现在大公司都更注重产品质量了。
3、说一个项目 问了15分钟
4、数组和链表的区别


5、linux的一些操作代码

https://www.wangan.com/wenda/4462
6、数据库的左连接 右链接连接

https://www.cnblogs.com/hungryquiter/p/17003716.html
7、手撕数据库 查询成绩

https://blog.csdn.net/m0_63839808/article/details/129968584
8、c++的多态 继承 封装

封装

将一类事物的属性和行为抽象为一个类,隐藏信息,留有公开接口访问操作,提高数据的隐蔽性的同时,使代码模块化,复用性更高。

封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式

简单的来说就是我将不想给别人看的数据,以及别人无需知道的内部细节, “锁起来” ,我们只留下一些入口,使其与外部发生联系。

好处

隐藏实现细节,提供公共的访问方式

提高了代码的复用性

继承

公共行为和属性抽象为一个父类,每一个子类都是一个特殊的父类,有父类的属性和方法,也有自己的属性和方法。进一步的提高了代码的复用性

优点

提高了代码的复用性,提高了代码的维护性(通过少量的修改,满足不断变化的具体要求),让类与类产生了一个关系,是多态的前提。

缺点

但是缺点也很显著:让类的耦合性增强,这样某个类的改变就会影响其他和该类相关的类。

多态

父类的引用变量可以指向任何一个子类的引用变量(向上转型)。
多态是同一个行为具有多个不同表现形式或形态的能力。
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。

多态的构成条件

  1. 必须通过基类的指针或者引用调用虚函数

虚函数:在类的普通成员函数前加上virtual关键字

  1. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写


9、c++的多态讲讲

多态

父类的引用变量可以指向任何一个子类的引用变量(向上转型)。
多态是同一个行为具有多个不同表现形式或形态的能力。
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。

多态的构成条件

  1. 必须通过基类的指针或者引用调用虚函数

虚函数:在类的普通成员函数前加上virtual关键字

  1. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写


10、怎么看链表是自环的

https://blog.csdn.net/qq_29997037/article/details/104555020

  1. 如何查看链表的头节点

https://linuxcpp.0voice.com/?id=54350
12、设计一个测试用例 测试微信接收短信
微信发送接受消息测试用例_微信消息推送测试_今天也是敲代码的一天哦的博客-CSDN博客

首先自我介绍,然后看我上次笔试做的题,问我感觉自己做得怎么样。接下来就是下面几个问题:

 1 小图片上的一个图像块,怎么对应到大图像上面 (图像缩放 ),写出思路。

https://zhuanlan.zhihu.com/p/240161780?utm_id=0

 2 二维数组 横排递增 纵列递增 找一个数字(剑指offer第三题)我用暴力分析 二分查找了分析一遍之后,让我写程序,我写了递归版本的。

class Solution {

public:

    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {

        int i = matrix.size() - 1, j = 0;

        while(i >= 0 && j < matrix[0].size())

        {

            if(matrix[i][j] > target) i--;

            else if(matrix[i][j] < target) j++;

            else return true;

        }

        return false;

    }

};

 3 用1x2 ,2x2的方块 填充一个2x8面积的长方形,有多少种方法(剑指offer第9题); 

4 linux命令 :sed awk head 怎么用?在linux下怎么安装程序?源码编译会吗?

Linux sed 命令是利用脚本来处理文本文件。

sed 可依照脚本的指令来处理、编辑文本文件。

Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

head 命令

所述头命令用于查看任何文本文件的第一行。默认情况下,它将显示前十行,但是您可以根据自己的喜好更改此数字。例如,如果只想显示前五行,则键入 head -n 5 filename.ext。

 5 https http 区别。 

HTTPS和HTTP的区别主要如下:

1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

总结:感觉问的挺简单,也没问c++基础,没问测试原理,没问数据库操作系统和网络,也没问我项目。。。感觉很奇怪。。。。而且,我的笔试做的真的很糟糕,三道编程题只做出来了一道,而且通过率只有70%多。。。。。诡异……周围很多大神没接到面试,而我等渣渣竟然接到面试,而且还问这么简单。。。。。是真不想招人,只是走走过场吗ヽ( ̄д ̄;)ノ=3=。。。

作者:MayDay1

链接:https://www.nowcoder.com/discuss/353154128933232640?sourceSSR=users

来源:牛客网

百度面经:软件测试开发

一面: 由于我是做的更多的是嵌入式和电子类相关的项目,跟互联网没多大关系,慌得一P,急忙水了一些了c/c++基础知识,嵌入式、软件测试理论基础以及数据库的基本***作准备面试 上午9点在酒店面试,面试官很nice,在我上去之前他已经把我网上注册的简历仔细浏览了一遍,也知道我的项目和互联网以及软件测试没有太大的联系,所以他就只是看着简历上的项目来问我,没有自我介绍,氛围很轻松,项目问的也很仔细,所以项目上的基础知识一定要清楚

后面他在选择就业这块和我讲了半小时他自己以及朋友的经历和看法,第一份工作及其重要,一定要选择大公司并认真考虑工作方向

全程聊了一个多小时,最后他说按照公司规定还是要考察下我的编程能力,所以给了我一个寻找

1.两个链表的公共交点的题,让我现场手撕代码。

class Solution {

public:

    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {

        if (headA == nullptr || headB == nullptr) {

            return nullptr;

        }

        ListNode *pA = headA, *pB = headB;

        while (pA != pB) {

            pA = pA == nullptr ? headB : pA->next;

            pB = pB == nullptr ? headA : pB->next;

        }

        return pA;

    }

};

思路有但是代码写起来,感觉乱七八糟。不他看了看我的代码,指出了些问题,觉得我思路是对的。就这样愉快地结束一面,说让我回去等消息。

怼项目

SQL语句:group by

GROUP BY 是用于将查询结果按照指定的列进行分组的关键字。通过 GROUP BY,可以根据指定的列将查询结果进行分组,以便对各组进行聚合操作,比如计算总数、平均值等。下面是一个示例:

假设有一张名为 "orders" 的表,它包含以下几列:order_id, customer_id, order_date, total_amount。我们可以使用 GROUP BY 对订单进行按照客户分组,然后计算每个客户的订单总金额。

SELECT customer_id, SUM(total_amount) as total_order_amount 

FROM orders

GROUP BY customer_id;

以上代码中,我们先选择了要显示的列 customer_id 和计算每个客户的订单总金额使用 SUM(total_amount)。然后使用 GROUP BY customer_id 将查询结果按照 customer_id 列进行分组。

需要注意的是,使用 GROUP BY 时通常会和聚合函数(如 SUM、AVG、COUNT 等)一起使用,以对每个分组进行聚合计算。

·C++,java的区别:

http://www.mobiletrain.org/about/BBS/107282.html

·java内存溢出

Java内存溢出(Java OutOfMemoryError)指的是在Java应用程序运行过程中,由于申请的内存超过了Java虚拟机(JVM)所能提供的内存限制,导致程序无法继续执行的错误。

当Java程序运行时,它会在JVM内存中分配堆内存(Heap),用于存储对象实例和数据。当程序需要更多内存空间时,JVM会自动进行内存分配。然而,如果程序申请的内存超过了JVM所能提供的限制,就会发生内存溢出错误。

Java内存溢出错误通常有两种情况:

堆内存溢出(Heap Space OutOfMemoryError):堆内存不足,无法存储更多的对象实例。这通常是因为程序创建了过多的对象,或者某个对象占用的内存过大。

栈溢出(Stack OverflowError):栈空间不足,无法存储更多的方法调用。这通常是由于递归调用导致的无限方法调用。

以下是一个Java内存溢出的示例代码:

import java.util.ArrayList;

import java.util.List;

 

public class OutOfMemoryErrorExample {

    public static void main(String[] args) {

        try {

            List<String> list = new ArrayList<>();

            while (true) {

                list.add("OutOfMemoryError");

            }

        } catch (OutOfMemoryError e) {

            System.out.println("发生了内存溢出错误:" + e.getMessage());

        }

    }

}

上述代码创建了一个ArrayList对象,并在一个无限循环中不断向其中添加元素,导致堆内存不足,最终引发内存溢出错误。

要解决Java内存溢出问题,可以尝试以下几种方法:

检查代码中是否存在内存泄漏(内存中不再使用的对象没有被正确释放)的情况,及时回收不再使用的对象。

调整JVM的内存配置参数,如增大堆内存大小(-Xmx参数)。

优化程序逻辑,减少内存使用,例如使用更高效的数据结构、避免创建过多的对象等。

使用Java的垃圾回收器(Garbage Collector)工具进行内存分析和优化。

需要注意的是,内存溢出错误可能还涉及到其他方面的原因,因此解决此类问题可能需要进一步的调查和分析。

~hashmap数据结构,哈希表扩容,哈希表负载因子

https://blog.csdn.net/qq_37084904/article/details/109243886

~string,stringbuffer,stringbuilder

https://blog.csdn.net/2301_78216679/article/details/132286349

~垃圾回收参数

内存溢出是指在程序运行过程中,申请的内存超过了系统或程序所能提供的限制。当程序运行时,需要使用的内存超过了系统分配给该程序的内存空间,就会发生内存溢出。

https://zhuanlan.zhihu.com/p/61662625

~jar包怎么跑起来

https://blog.csdn.net/qq_41974251/article/details/119765588,

~python,java运行方式有什么不同

Java通常在Java虚拟机(JVM)上运行,具有良好的跨平台性,适合构建大型、高性能的企业级应用;而Python通常在Python解释器上运行,适合快速原型开发和科学计算。

http://www.ixianzong.com/40475.html

计算机网络:

           响应报文状态码

常见的响应状态码(详细介绍)_杰瘦瘦的博客-CSDN博客

            tcp和udp的区别

 TCP和UDP协议的区别

TCP是面向连接、保证传输的协议,而UDP是无连接的协议。

TCP传输数据稳定可靠,适用于对网络通讯质量要求较高的场景,需要准确无误的传输给对方,比如,传输文件,发送邮件,浏览网页等等。在传输数据前,双方会先建立一条虚拟的通道,可以减少数据传输差错。

UDP的优点是速度快,但是可能产生丢包,所以适用于对实时性要求较高但是对少量丢包并没有太大要求的场景。比如:域名查询,语音通话,视频直播等。在数据传输时,每个数据段都是一个独立的信息,包括完整的源地址和目的地,因此,数据能否被对方接收、数据到达的实践和内容的完整性有序性都无法得到保证。

以生活中常见的通讯为例:UDP协议就相当于是写信给对方,寄出去信件之后不能知道对方是否收到信件,信件内容是否完整,也不能得到及时反馈,而TCP协议就像是打电话,你需要知道对方的号码才能打电话,交流的内容可以实时反馈,确保信息的完整性

             http和https的区别

1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

~linux命令:https://www.wangan.com/wenda/4462

新建目录

使用 mkdir 命令创建一个新目录 - 如果键入 mkdir Music,它将创建一个名为 Music 的目录。还有一些额外的 mkdir 命令:要在另一个目录中生成新目录,请使用此 Linux 基本命令 mkdir Music / Newfile 使用 p(父级)选项在两个现有目录之间创建一个目录。例如,mkdir -p Music / 2022 / Newfile 将创建新的 “2022” 文件。

~shell:函数传递参数

Shell函数参数

~数组和链表的区别

单向链表打印倒数第n个加优化

class Solution {

public:

    int kthToLast(ListNode* head, int k) {

        ListNode *pre = head, *cur = head;

        for (int i = 0; i < k; i++)

            cur = cur->next;

        while (cur != nullptr) {

            pre = pre->next;

         }

        return pre->val;

    }

};

测试写写出的函数

百度秋招 测试开发工程师一面 面经

#面经##百度2024校园招聘##测试开发#

1、自我介绍

2、项目背景需求

3、项目用的核心技术的介绍(楼主用的代理重加密)

4、项目中担任的角色

5、TCP和UDP的区别

·TCP/UDP区别? 

TCP和UDP协议的区别

TCP是面向连接、保证传输的协议,而UDP是无连接的协议。

TCP传输数据稳定可靠,适用于对网络通讯质量要求较高的场景,需要准确无误的传输给对方,比如,传输文件,发送邮件,浏览网页等等。在传输数据前,双方会先建立一条虚拟的通道,可以减少数据传输差错。

UDP的优点是速度快,但是可能产生丢包,所以适用于对实时性要求较高但是对少量丢包并没有太大要求的场景。比如:域名查询,语音通话,视频直播等。在数据传输时,每个数据段都是一个独立的信息,包括完整的源地址和目的地,因此,数据能否被对方接收、数据到达的实践和内容的完整性有序性都无法得到保证。

以生活中常见的通讯为例:UDP协议就相当于是写信给对方,寄出去信件之后不能知道对方是否收到信件,信件内容是否完整,也不能得到及时反馈,而TCP协议就像是打电话,你需要知道对方的号码才能打电话,交流的内容可以实时反馈,确保信息的完整性。

  1. DNS

域名系统(Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。DNS协议是用来将域名转换为IP地址(也可以将IP地址转换为相应的域名地址

DNS是什么?

DNS全名为Domain Name System,又称为网域名称系统,是网路的一项服务,用来进行网域名称(Domain name)与IP间的转换。

为什么使用DNS?

上网势必要有IP,但是对于人类来说,它是一串无意义的数字,不方便记忆,而网域名称,是由英文字母组成,比较好记。因此透过DNS,我们只要输入google,就可以找到网站。

  1. 输入网页到显示为止的过程(这里我只答到了ARP结束发送HTTP请求为止,后面HTTP处理以及页面的渲染是面试官补充的)

https://www.1mxy.cn/4885.html

  1. C++面向对象的特性有哪些,分别介绍下

面向对象

概念:面向对象则是一种以对象为中心的编程思想,就是通过分析问题,分解出一个一个的对象,然后通过不同对象之间的调用来组合解决问题。建立对象的目的不是为了完成某个步骤,而是为了描述某个事物在解决整个问题的过程中的行为。

如上面的例子,汽车发动、汽车熄火,对于面向对象而言,我们则关心的是汽车这类对象,两个事件只是这类对象所具备的行为。

优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护。

缺点:一般来说性能比面向过程低

封装

将一类事物的属性和行为抽象为一个类,隐藏信息,留有公开接口访问操作,提高数据的隐蔽性的同时,使代码模块化,复用性更高。

封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式

简单的来说就是我将不想给别人看的数据,以及别人无需知道的内部细节, “锁起来” ,我们只留下一些入口,使其与外部发生联系。

好处

隐藏实现细节,提供公共的访问方式

提高了代码的复用性

继承

公共行为和属性抽象为一个父类,每一个子类都是一个特殊的父类,有父类的属性和方法,也有自己的属性和方法。进一步的提高了代码的复用性

优点

提高了代码的复用性,提高了代码的维护性(通过少量的修改,满足不断变化的具体要求),让类与类产生了一个关系,是多态的前提。

缺点

但是缺点也很显著:让类的耦合性增强,这样某个类的改变就会影响其他和该类相关的类。

多态

父类的引用变量可以指向任何一个子类的引用变量(向上转型)。

多态是同一个行为具有多个不同表现形式或形态的能力。

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。

多态的构成条件

1.必须通过基类的指针或者引用调用虚函数

虚函数:在类的普通成员函数前加上virtual关键字

  1. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写

  1. C++引用是什么,和指针有什么区别

https://blog.csdn.net/qq_65139309/article/details/123155326

  1. 手撕代码:移除链表中的所有重复元素(需要从零设计链表和测试用例)

    typedef struct node{

int val;

struct node *next;

}LNode,*ListNode;

public ListNode deleteDuplicates(ListNode head) {

        // 1.base case

        if (head == null || head.next == null) {

            return head;

        }

        head.next = deleteDuplicates(head.next);

        return head.val == head.next.val ? head.next : head;

    }

  1. 自己给上面的代码设计测试用例,讲一下设计思路

微信发送接受消息测试用例_微信消息推送测试_今天也是敲代码的一天哦的博客-CSDN博客

  1. Linux常用命令

https://www.wangan.com/wenda/4462

  1. shell用过没

Shell函数参数

14、用过什么数据库

15、根据需求写一个SQL语句(查询所有重复出现的邮件)

select Email

from Person

group by Email

having count(Email) > 1;

  1. 用过chatGPT没,你是怎么看待的

https://www.xiaohongshu.com/explore/63fe26800000000027001271

17、可以提前来实习吗

18、反问

----------------------------------------

晚上七点开始面的,大概五十分钟

没怎么深挖技术点

在线祈求一个offer(痴人做梦ing)

作者:vivmoy

链接:https://www.nowcoder.com/feed/main/detail/e77cee025b7643cfbd87efc4a4464287?sourceSSR=users

来源:牛客网

大二学渣百度测试开发一面

1.C/C++

~虚函数 动态绑定

指针引用

虚函数(Virtual Function)是一种在面向对象编程中经常使用的概念。它允许在基类中定义一个函数,在派生类中进行重写,并在运行时根据对象的实际类型调用正确的函数实现。

在C++中,通过使用关键字"virtual"来声明虚函数。虚函数可以通过继承关系进行覆盖重写,当通过基类的指针或引用调用虚函数时,会根据实际对象类型调用正确的函数版本。

以下是一个示例代码:

#include<iostream>

using namespace std;

 

// 基类

class Base {

public:

    virtual void func() {

        cout << "Base::func() called" << endl;

    }

};

 

// 派生类

class Derived : public Base {

public:

    void func() {

        cout << "Derived::func() called" << endl;

    }

};

 

int main() {

    Base* b = new Derived();  // 创建一个派生类对象,并将其赋值给基类指针

    b->func();  // 通过基类指针调用虚函数

 

    delete b;  // 释放内存

 

    return 0;

}

输出结果:

Derived::func() called

在上述代码中,我们定义了一个基类Base和一个派生类Derived。在基类中,我们声明了一个虚函数func()。派生类Derived重写了这个虚函数。

在主函数中,我们创建一个派生类对象,并将其赋值给基类指针b。接着通过该指针调用虚函数func(),由于多态的特性,最终调用的是Derived类中的重写函数。

这就是虚函数的基本概念和用法。通过使用虚函数,我们可以实现多态性,提供了更好的灵活性和扩展性。

动态绑定是指在运行时确定调用具体方法或属性的过程。它与静态绑定相对,静态绑定在编译时确定调用的方法或属性。

动态绑定的实现方式可以是虚函数表(vtable)或消息传递机制。

虚函数表(vtable)是一种实现动态绑定的常见方式,它是一个包含了类中所有虚函数地址的表。每个对象都有一个指向该类的虚函数表的指针。当调用虚函数时,通过该指针找到正确的虚函数地址,然后调用相应的函数。

示例代码:

class Animal {

public:

    virtual void eat() {

        cout << "Animal eats" << endl;

    }

};

 

class Cat : public Animal {

public:

    void eat() override {

        cout << "Cat eats" << endl;

    }

};

 

int main() {

    Animal* animal = new Cat();

    animal->eat();  // 输出 "Cat eats"

    delete animal;

    return 0;

}

消息传递机制是另一种实现动态绑定的方式,它不使用虚函数表。在消息传递机制中,每个对象都有一个消息传递的函数,当接收到一条消息时,该对象根据消息内容执行相应的操作。

示例代码:

class Animal:

    def eat(self):

        print("Animal eats")

 

class Cat(Animal):

    def eat(self):

        print("Cat eats")

 

animal = Cat()

animal.eat()  # 输出 "Cat eats"

无论是虚函数表还是消息传递机制,动态绑定都允许子类对象在继承基类的同时对方法进行重写,实现多态性。

指针引用

https://blog.csdn.net/qq_65139309/article/details/123155326

如果i=5;那么 a=(++i)--;之后,a和i的值各是多少 

STL用过吗

STL基础知识 简介_C++七星瓢虫的博客-CSDN博客

vector和List区别?

https://blog.csdn.net/amf12345/article/details/100057308

2.SQL 建表 插入数据 索引 分库分表

SQL高级教程:SQL 创建数据库、表以及索引_51CTO博客_创建数据库表的sql语句

https://www.fengnayun.com/news/content/335417.html

3.PHP中PDO连接mysql

https://www.php.cn/faq/584304.html

4.Linux sed命令 找到8080端口占用进程 

~man和help区别

help命令用于显示shell内部的帮助信息。help命令只能显示shell内部的命令帮助信息。而对于外部命令的帮助信息只能使用man或者info命令查看。

man命令,通过man指令可以查看Linux中的指令帮助、配置文件帮助和编程帮助等信息。

一般看信息都用查看man文档,而help只是一个简单的描述,方便,但man文档中都包含了。help 是内部命令的帮助,比如cd ,man 是外部命令的帮助,比如ls。

~5.Vagrant Docker使用情况

什么是Vagrant和Docker?

Vagrant是一种虚拟化技术,它可以让你快速地构建与管理虚拟化开发环境。Vagrant可以支持不同的虚拟引擎(例如,VirtualBox、VMware、Hyper-V等),因此你可以选择适合你当前开发环境的引擎来运行你的虚拟开发环境。

Docker 是一种容器化技术,它可以帮助你快速创建、部署和运行应用程序和服务。Docker容器可以在任何环境中运行,并提供强大的环境隔离和版本控制机制。

为什么使用Vagrant + Docker进行本地开发和测试?

当我们需要在多个环境下测试我们的代码时,我们需要像生产环境一样准确地进行开发和测试,特别是每个环境的差异和配置需要与生产环境一致。在这种情况下,使用Vagrant + Docker可以帮助开发者在多个环境下完成复杂的测试和维护工作,不用担心环境参数设置的不一致和误操作导致的错误。

6.不调用C++/C的字符串库函数,请编写函数 strcpy

char *strcpy(char *strDest, const char *strSrc)

{

    if((strDest==NULL) || (strSrc==NULL))

    {

        return NULL;

    }

    char *address=strDest;

    while((*strDest++ = *strSrc++) != '0')

    {

        NULL;

    }

    return address;}

  1. 最大子数组之和

class Solution {

public:

    int maxSubArray(vector<int>& nums) {

        int pre = 0, maxAns = nums[0];

        for (const auto &x: nums) {

            pre = max(pre + x, x);

            maxAns = max(maxAns, pre);

        }

        return maxAns;

    }

};

8.QQ登录测试样例

https://zhuanlan.zhihu.com/p/98924580?ivk_sa=1024320u&utm_id=0

9.读了那些书 Unix内核源码剖析 深度理解对象模型 Web全栈工程师自我修养 读书感悟

10.自动化测试了解

自动化测试,即利用工具或者脚本来达到软件测试的目的,没有人工或极少人工参与 的软件测试活动称为自动化测试。自动化测试的优势如下:

1) 更方便对系统进行回归测试。当软件的版本发布比较频繁时,自动化测试的效果更加明。

2) 可以自动处理原本烦琐、重复的任务,提高测试的准确性和测试人员的积极性。

3) 自动化测试具有复用性和一致性,即测试脚本可以在不同的版本上重复运行,且可以保障测试内容的一致性。

  1. 为什么不投研发

测试开发工程师

一、任务:

顾名思义,该岗位既要懂测试又要懂开发。它是一个集开发和质量意识于一身的角色。需要有开发人员的技能和测试人员的思维,会参与单元测试代码编写、业务代码评审、测试工具开发、测试平台开发、框架开发。

二、选择测开的原因:

2.周边的同学基本都是做开发或者算法,所以通过他们了解了一些关于开发和算法岗的情况。经过认真思考,根据自己之前的工作经验和自身特点,选择了测开这个岗位,后来自己也去了解了一些测开的知识,我觉得相对于开发岗或者算法岗,做测试这个工作更让我有成就感一些,我本身也挺喜欢测开这个工作模式。因为现在客户对产品的质量越来越高,所以对产品的测试也越来越重要,比如性能测试和安全测试。因为测开这个岗位需要了解的东西很多,前端、开发、算法都需要了解一些。因此如果需要转岗的话,测开也是比较好转的,面对实习工作,我也想有更有可能性一些,不想一开始就把自己定位到某一个岗位上,我也想多学习,多了解一些知识。

三、对测开的职业认识

具有测试能力的基础上兼备开发能力;另一方面自动化测试成为趋势,利用开发的技巧解决测试中的问题以提高测试效率。测试开发工程在公司一般有两种,一种是单纯为测试团队开发测试工具或者系统。另一种就是在测试过程中发挥主观能动,利用自动化把重复劳动降至最低,比如开发适用于特定场景的测试工具、测试脚本和测试用例。

12.为啥学汇编

1.汇编语言对理解高级语言的特性有很大帮助。

  可以先举几个例子。

  在C语言中,有两种传递参数的种类,一种是值传递,一种是指针传递。也就是值传递,是把变量的数值传递给子函数。我们经常有一个疑问,一个变量传递给子函数为什么会只是传值呢,如果你了解汇编语言,知道C语言的函数调用时栈的变化你就会理解这是怎么回事。

2.汇编语言有助于程序的调试

13.有没有博客

14. 项目相关

15.实习时间

百度测试开发一面凉经

1.自我介绍

2.OSI 七层架构

https://www.pianshen.com/article/7720489945/

  1. Tcp/Ip 五层架构

https://blog.csdn.net/qq_52134698/article/details/130560987

  1. 讲下每层中应用的协议

https://blog.csdn.net/qq_52134698/article/details/130560987

  1. TCP和UDP的区别,分别应用场景

TCP是面向连接、保证传输的协议,而UDP是无连接的协议。

TCP传输数据稳定可靠,适用于对网络通讯质量要求较高的场景,需要准确无误的传输给对方,比如,传输文件,发送邮件,浏览网页等等。在传输数据前,双方会先建立一条虚拟的通道,可以减少数据传输差错。

UDP的优点是速度快,但是可能产生丢包,所以适用于对实时性要求较高但是对少量丢包并没有太大要求的场景。比如:域名查询,语音通话,视频直播等。在数据传输时,每个数据段都是一个独立的信息,包括完整的源地址和目的地,因此,数据能否被对方接收、数据到达的实践和内容的完整性有序性都无法得到保证。

以生活中常见的通讯为例:UDP协议就相当于是写信给对方,寄出去信件之后不能知道对方是否收到信件,信件内容是否完整,也不能得到及时反馈,而TCP协议就像是打电话,你需要知道对方的号码才能打电话,交流的内容可以实时反馈,确保信息的完整性。

  1. http和https区别

1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

  1. 状态码(我大概讲了10几个)

https://blog.csdn.net/m0_62218466/article/details/130416085

  1. dns解析过程、

一文读懂DNS解析原理及常见解析记录类型(中科三方) - 知乎

其完整的DNS解析过程有以下几个步骤:

(1)查看浏览器缓存

当用户通过浏览器访问某域名时,浏览器首先会在自己的缓存中查找是否有该域名对应的 IP 地址(若曾经访问过该域名且没有清空缓存便存在)。

(2)查看系统缓存

当浏览器缓存中无域名对应 IP 则会自动检查用户计算机系统 Hosts 文件 DNS 缓存是否有该域名对应 IP。

(3)查看路由器缓存

当浏览器及系统缓存中均无域名对应 IP 则进入路由器缓存中检查,以上三步均为客服端的 DNS 缓存。

(4)查看ISP DNS 缓存

当在用户客服端查找不到域名对应 IP 地址,则将进入 ISP DNS 缓存中进行查询。比如你用的是电信的网络,则会进入电信的 DNS 缓存服务器中进行查找。

(5)询问根域名服务器

当以上均未完成,则进入根服务器进行查询。全球仅有 13 台根域名服务器,1 个主根域名服务器,其余 12 为辅根域名服务器。根域名收到请求后会查看区域文件记录,若无则将其管辖范围内顶级域名(如.com、.cn等)服务器 IP 告诉本地 DNS 服务器。

(6)询问顶级域名服务器

顶级域名服务器收到请求后查看区域文件记录,若无记录则将其管辖范围内权威域名服务器的 IP 地址告诉本地 DNS 服务器。

(7)询问权威域名(主域名)服务器

权威域名服务器接受到请求后查询自己的缓存,如果没有则进入下一级域名服务器进行查找,并重复该步骤直至找到正确记录。

(8)保存结果至缓存

本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时将该结果反馈给客户端,客户端通过这个 IP 地址即可访问目标Web服务器。至此,DNS递归查询的整个过程结束。

DNS系统承担着将域名解析成IP地址的重要作用,是计算机之间实现访问互联的关键和基础。因此,DNS解析的安全对于维持网络稳定运行至关重要。企业相关管理者和运营者一定要做好域名及域名解析的安全防护工作,定期进行数据扫描分析,启用全方位DNS风险监测,实时关注DNS运行状态,同时做好妥善的应急备份准备,一旦发现问题,出现故障,第一时间响应解决,才能将DNS故障风险及其带来的损失降至最低点。

  1. 如果无法打开某个网页怎么排查问答题 (先确定服务端问题还是客户端问题,最直接的就是抓包,本地网络联通情况=>DNS情况=>目标服务器情况)

  1. 进程和线程的区别

1、根本区别

进程和线程的根本区别是进程是操作系统(OS)资源分配的基本单位,而线程是处理器(CPU)任务调度和执行的基本单位。

2、资源开销:

每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

3、包含关系:

如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线

同完成的;线程是进程的一部分,所行过程不是一条线的,而是多条线(线耗)其被称为轻权进程或者轻量级进程。

4、内存分配:

同一进程的线程共享本进分享截屏空间和资源,而进程之间的地址空间和资源是相互独立的。

5、影响关系:

一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

6、执行过程:

每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行。

  1. 讲下Linux文件命令(is cat cd touch mkdir mv cp ln )

https://www.wangan.com/wenda/4462

12.在A文件中查字符串“bcd”什么命令( cat A.txt| grep -"bcd"  )

13.进程之间的通信方式

https://www.xinzhiweike.com/wenda/1650882761082692

  1. MySql和Redis的区别

区别:1、MySQL是关系型数据库;而Redis是非关系型数据库。2、MySQL用于持久化存储数据到硬盘,功能强大,但是速度缓慢;而Redis用于存储使用较为频繁的数据到缓存中,读取速度快。3、MySQL的数据存放在磁盘中;而Redis的数据存放在内存中。4、MySQL常用数据类型有数值、日期/时间、字符串;Redis常用数据类型有字符串、Hash、List、Set、Zset。

  1. 了解过其他类似Springboot的框架么

https://blog.csdn.net/mxy_111/article/details/125284566

  1. Liunx查看磁盘里某个大文件大小(答的 “du”  让具体说一个答的 “du -h -a/dir | grep"[0-9]G\b”)

ls -l ljl.txt

~Mysql 出现慢查询的原因(答的是1.先开慢日志开关     2.进行慢日志分析    3.查看硬件问题如网络速度慢,内存不足     4.没有索引或者索引失效    5.数据过多,分库分表      5服务器参数调优my.cnf)

1. 索引未被合理使用:索引是用于加速查询的重要组成部分。如果查询语句没有用到合适的索引,那么查询将会非常缓慢。因此,我们需要确保所有查询都使用索引,并查看是否需要添加新索引以提高查询性能。

2. 忘了使用WHERE子句:如果没有使用WHERE子句过滤数据,那么将搜索整个表,这将导致慢查询问题。因此,请确保您的查询是针对需要的数据进行精确查找。

3. Joins未被优化:Join是连接两个或多个表的操作。如果查询中包含了多个Join操作,那么将会非常缓慢。因此,请确保您的查询中的Join操作使用了优化的算法,否则将导致慢查询。

4. 大表查询:如果您查询的表非常大,那么查询将会非常缓慢。在这种情况下,您可以考虑缓存结果,或者使用分页将结果集分为若干页。

以上是可能导致慢查询问题的一些原因。通过分析查询执行计划和MySQL日志,您可以识别和排除慢查询问题。优化查询或数据库架构也可能需要进行调整以提高性能。

  1. 数据库事务的特性(ACID)

https://zhuanlan.zhihu.com/p/579860676

  1. 写SQl,查询A表后10行数据

select * from A order by id desc limit 0,10) order by id ;

  1. 讲下Java和C++ 对于内存管理的不同

Java与C++内存管理的区别:

对于C、C++程序开发人员来说,在内存管理领域,他们既拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任。

对于JAVA程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄露和内存溢出问题。由虚拟机管理内存看起来很方便,但是,也正是因为Java程序员把内存控制的权利交给了Java虚拟机,一旦出现内存泄露和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会成为一项异常艰难的工作。

  1. 了解Exception和Error 的区别么

Error 和 Exception 都是Throwable的子类, 在java中只有Throwable类型的实例才可以被抛出或者捕获,它是异常处理机制的基本类型.

1,Exception 和 Error体现了java平台设计者对不同异常情况的分类, Exception是程序正常运行中,可以预料的意外情况,可以被捕获,进行相应的处理.

2.Error 是指正常情况下,不大可能出现的情况,绝大部分的Error 都会导致程序处于非正常的,不可恢复的状态, 不需要捕获, 常见的OutOfMemoryError 是Error的子类.

3.Exception 分为可检查异常(checked) 和 不可检查异常(unchecked).可检查异常在源代码里必须显式的进行捕获处理,这是编译期检查的一部分,不可检查异常是指运行时异常, 比如NullPointerException, ArrayIndexOutOfBoundsException之类, 通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求

22.讲下您遇到的Exeption 

23.讲下您遇到的Error

24.项目中用了Elasticsearch,其中的遇到难点是什么呢(答的 es如何跨域 和 es如何通过内网IP进行访问  )

25.如何解决的呢 (答的是通过修改添加config.yml 参数)

26.目前的实习单位工作是什么

27.你认为你现在实习单位 Selenium框架维护成本高

维护成本高:Selenium 自动化测试框架通常需要随着被测试应用程序的变化而不断更新和维护。

28.归并排序,写一半看懂了不让写了

#include <iostream>

using namespace std;

int a[100010], b[100010];

//将数组a[]从l到r的位置进行归并排序

void mergeSort(int l, int r)

{

  //当[l...r]中只有一个数时或没有数时,递归结束

  if(l >= r) return;

  int mid = (l + r) / 2; //找到中间位置

  //分成两个部分,对这两个部分分别进行归并排序

  mergeSort(l, mid); mergeSort(mid + 1, r);

  //i是第一部分左边的哨兵,j是第二部分左边的哨兵

  int i = l, j = mid + 1, k = l; //k表示合并后放入b数组的位置

  //哨兵没有走到头

  while(i <= mid && j <= r)

  {

    if(a[i] <= a[j]) b[k ++] = a[i ++]; //将较小的a[i]合并到b数组中

    else b[k ++] = a[j ++];//将较小的a[j]合并到b数组中

  }

  while(i <= mid) b[k ++] = a[i ++]; //将左边剩余元素合并到b数组

  while(j <= r) b[k ++] = a[j ++]; //将右边剩余元素合并到b数组

  //将b数组拷贝回a数组

  for(int i = l; i <= r; i ++) 

    a[i] = b[i];  

}

int main()

{

  int n;

  cin >> n;

  for(int i = 1; i <= n; i ++)

    cin >> a[i];

  //将数组a[]从1到n的位置进行归并排序

  mergeSort(1, n);  

  for(int i = 1; i <= n; i ++)

    cout << a[i] << " ";

  return 0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值