招银科技2017 c++ 面试题

程序内存分布,全局变量、静态变量的存储位置

static修饰符作用

static全局变量跟普通全局变量区别,存储方式有何区别c++设计一个单例模式,多线程环境下如何设计?用线程锁是否会影响性能?有其他方案吗介绍下c++ socket 模型, 建立tcp连接的步骤。多线程同步方式有哪些进程、线程的区别进程间有哪些通信方式,各自优点是什么。

拷贝构造函数参数为何必须为引用

笔试题量很大,可惜很多没记住。大概讲下有印象的考点:

数据库方面考了很多,有很多我都没听过。

inner join,outer join,索引

软件工程知识也不少,还有敏捷开发

32位机上编译的 sizeof(char*),64位机子上输出什么?这题我觉得Linux上运行不了,win可以,但是我没有32位机子,没法测试,有人知道吗?

异或运算

短小常用函数在c里用什么代替,c++里用什么代替

char* const p和char const * p的区别

这题说一个我的记忆方法:把*视为point to,然后从后往前读,比如

char const * p就是p piont to a const char

char* const p就是p is const which point to a char

const char* p就是p point to a char which is const

所以char const * p和const char* p的意义是一样的,p指向的内存不可变,char* const p的意义是p本身的值不可变。

构造函数内调用另一个构造函数

class A {
    int m_age;
    string m_name; 
public:
    A(const int& age){
        A(age, "");
    }
    A(const int& age, const string& name) : m_name(name), m_age(age){}
};

在java等平台支持语言中这种写法比较常见,但在c++中语法是没问题,但是结果肯定不是你想要的。

A(const int& age){
    A(age, "");
}
在 A(const int& age)内调用A(age, ""),在栈上构造了另一个匿名A对象,然后函数返回,匿名对象被销毁,然而当前对象成员却没有被初始化,成员值随机。如果非要这样写来达到重用代码,可以这样写

A(const int& age) {
    new (this)A(age, "");
}

c11及以上支持在初始化列表中调用另一个构造函数,不能写在函数体内。如

class A {
    int m_age;
    string m_name; 
public:
    A(const int& age) : A(age, "") {}
    A(const int& age, const string& name) : m_name(name), m_age(age){}
};


需要注意的是,被调用的构造函数必须完整初始化所有成员。所以A(const int& age) 可以调用A(const int& age, const string& name),而反过来不行。


编程题:

1. 实现单项链表反转,只允许遍历一次。

2. 两个字符串,实现判断其中一个是不是另一个的子串,区分大小写,同时还要写test case

3. 传入6个字节长度的旧密码、新密码、再次输入的新密码三个字符串指针,然后判断是否符合以下规则:

新密码不能跟旧密码相同,两次输入的新密码要相同,密码为6位长度的数字的字符,新密码不能是123456或654321这样的有序数字或是666666这样的同一个数字。

关键是这题代码只能在for循环里里填

int changePasswdIsOk(char* Old, char* New, char* New2) {

	if (Old == NULL || New == NULL || New2 == NULL)
		return 0;

	for (int i = 0; i < 6; i++) {
	
	}

}

本来看到这种题,一般会在循环外定义标志位用来保存上一次的状态,然后与下次循环判断结果相与,但是这题要求只能在循环内写代码,当时是有一点点思路的,就是在循环内创建静态标志位,但是想着想着最后还是要在循环外判断最终结果才能返回最终结果,时间又紧,下场面试的人已经在催了,就放弃了。回到家中还是没啥思路,想百度也不知道搜什么关键词,后来又想了想,写出来了:

bool changePasswdIsOk(const char Old[], const char New[], const char New2[]) {

    if (Old == NULL || New == NULL || New2 == NULL)
        return false;

    for (int i = 0; i < 6; i++) {
        static bool EachIsSame = true;
        static bool isOrderedInc = true;
        static bool isOrderedDec = true;
        static bool isSameWithOld = true;

        if (New[i] != New2[i])
            return false;
        if ('0' > New[i] || '9' < New[i])
            return false;
        
        if (isSameWithOld && New[i] != Old[i])
            isSameWithOld = false;
        
        if (i < 5) {
            if (EachIsSame && New[i] != New[i + 1]  )
                EachIsSame = false;
            if (isOrderedInc && New[i] != New[i + 1] - 1)
                isOrderedInc = false;
            if (isOrderedDec && New[i] != New[i + 1] + 1)
                isOrderedDec = false;
        }
        else 
            return !(isSameWithOld || EachIsSame || isOrderedInc || isOrderedDec);
    }
    return true;
}
测了下都通过了。

上上周五去二面了,之前接到二面通知还挺高兴的,还以为过了一面,结果好像去了一面的人都去二面了。然后所有岗位的就两个面试官轮着面,其中一个还是HR。我还是第一次遇到这样的,不知怎么形容。

二面HR问我的核心卖点是什么,问以前单位离职原因,问期望薪资。技术让我挑一个最值得讲的项目讲,然后问我最大的难点在哪。后来问,有一个很大的文件,比如一个G,要怎么传比较好。我说切成多片,多线程传输。他感觉不是很满意。但也没说应该怎么传。后来我问了几个朋友,也都说会切片传输。算上那个可有可无的心理测试,等了快有一个半小时,然后面试十分钟不到就灰溜溜的回去了,当然之后也没后续了。



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值