字节跳动互娱面试题演练

一面:

项目

手写单例模式

面试的时候不要画蛇添足,按照按面试管的节奏来,先写一个简单的单例模式,除非特别熟悉, 不要一上来就考虑线程安全问题。

单例分为饿汉模式和懒汉模式,饿汉模式一开始就创建好,懒汉模式需要用户自己创建

class Singleton{
public:
	static Singleton& getInstance(){
		return inStance;
	}
private:
	Singleton() {
		std::cout << "Singleton():" << this << std::endl;
	}
	
	//防拷贝
	Singleton(const Singleton&) = delete;
	Singleton& operator=(const Singleton&) = delete;
	
private:
	static Singleton inStance;
};

Singleton Singleton::inStance; //静态对象类外初始化

 要记住设为私有的有构造函数,拷贝构造函数,赋值重载函数三个函数。

懒汉模式:不必在程序一开始就创建实例,保证在使用之前创建好即可。

class Singleton{
public:
	static Singleton* getInstance(){
		if(p_inStance == nullptr){
			p_inStance = new Singleton();
		}
		return p_inStance;
	}
private:
	Singleton(){
		std::cout << "Singleton()" << this << std::endl;
	}
	
	Singleton(const Singleton&) = delete;
	Singleton& operator=(const Singleton&) = delete;
	
private:
	static Singleton* p_inStance;
};

Singleton* Singleton::p_inStance = nullptr;

如果在问深入一点可以,考虑线程完全问题,在C++11中通过加锁可以解决。

class Singleton{
public:
	static Singleton* getInstance(){
		if(p_inStance == nullptr){ //减少线程阻塞
			m_mutex.lock();
			if(p_inStance == nullptr){
				p_inStance = new Singleton();
			}
			m_mutex.unlock();
		}
		return p_inStance;
	}
	
	class GC{
	public:
		~GC(){ //垃圾回收类
			if(p_inStance != nullptr){
				delete p_inStance;
			}
		}
	};
	
	static GC gc; //定义静态成员变量,当程序结束时,系统自动调用析构函数
private:
	Singleton(){
		std::cout << "Singleton()" << this << std::endl;
	}
	
	Singleton(const Singleton&) = delete;
	Singleton& operator=(const Singleton&) = delete;
	
private:
	static Singleton* p_inStance;
	static std::mutex m_mutex;
};

Singleton* Singleton::p_inStance = nullptr;
std::mutex Singleton::m_mutex;
Singleton::GC Singleton::gc;

 

TCP/UDP及应用场景

 

volatile

防止编译器优化

分布式锁

 

进程/线程

然后一道题:一个单链表从表结尾开始每隔k个元素进行反转,例如:1->2->3->4>5->6->7,k=3,反转后,1->4->3->2->7->6->5

 

 

二面:

LInux的ctrl C ,kill 的内部原理,

信号机制

kill命令的工作原理是,向Linux系统的内核发送一个系统操作信号和某个程序的进程标识号,然后系统内核就可以对进程标识号指定的进程进行操作

 

socket编程【客户端发一个,服务器回发一个一样的】,

echo服务器。

 

段页式内存管理会访问多少次内存【二面一个没答上来?】,

估计看我可怜兮兮的问了我一个TCP,多线程打印

 

然后代码题:134876923431586532,任意移动字符位置,不限制移动次数,写出算法找到移动后比给定字符串大并且最接近它的那个

你有什么想问的吗

 

1.HTTP和RPC的区别

 

2.HTTP的常见方法,post与get差别,常见的请求头key-val对儿

GET,POST, HEAD,PUT, DELETE, OPTIONS等

GET:获取资源

POST:传输实体主体

POST 主要目的不是获取资源,而是传输实体主体数据。

GET POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL中,而 POST 的参数存储在实体主体部分。

GET 的传参方式相比于 POST 安全性较差,因为 GET 传的参数在 URL 是可见的,可能会泄露私密信息。并且 GET 只支持 ASCII 字符,如果参数为中文则可能会出现乱码,而 POST 支持标准字符集。

3.后台报504错误,分析原因如何解决
 

4.数据库的索引问题,针对场景如何建立索引,为什么这么建立索引,怎样优化

mysql 。订单 order 实体有几个属性:产品(product_id)、下单日期(date)等,请设计 索引 实现下列需求并优化索引:
------
查询某个产品的所有订单。
查询某一天的所有订单。
查询有个产品最近一个月的所有订单。
-----

5.编程题

对两个二进制字符串求十进制的和

Leetcode67题

6.设计一个HTTP服务,如何查询出订单量前十的商品,后台如何做

 

7.python的并发的问题

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值