面试准备

1、正整数n的操作有两类:如果n为奇数,可以加1或者减1;如果n为偶数,可以除以2。设计一个函数,求出最少需要多少次操作使得n=1?

用二进制去处理。关键是如何判断在n为奇数时到底是加1还是减1。自己找两个例子分析一下就可以发现规律,当n的二进制码的最后3位是‘111’时,需要加1。其他奇数情况需要减1。偶数情况下,当然是除以2了。

int count_Operation(int n)
{
	//计数操作次数
	int count=0;
	//主要是在n为奇数的情况下,如何判断
	//是执行+1操作还是-1操作
	while (n!=1)
	{
		if((n&0x111)==0x111)
			n+=1;
		else if ((n&0x1)==0x1)
			n-=1;
		else
			n/=2;
		count++;
	}
	return count;
}

2、仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false
class MyQueue {
    stack<int> instack,outstack;
    void in2out() {
        while(!instack.empty()) {
           outstack.push(instack.top());
            instack.pop();
        }
    }
public:
    MyQueue() {}
    
    void push(int x) {
        instack.push(x);
    }
    
    int pop() {
        if(outstack.empty()){
            in2out();
        }
        int x = outstack.top();
        outstack.pop();
        return x;
    }
    
    int peek() {
        if(outstack.empty()){
            in2out();
        }
        return outstack.top();
    }
    
    bool empty() {
        return instack.empty() && outstack.empty();
    }
};

3、请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppop 和 empty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
class MyStack {
private:
    queue<int> queue1;
    queue<int> queue2;
public:
    MyStack() {}
    
    void push(int x) {
        queue2.push(x);
        while(!queue1.empty()){
            queue2.push(queue1.front());
            queue1.pop();
        }
        swap(queue1, queue2);
    }
    
    int pop() {
        int r = queue1.front();
        queue1.pop();
        return r;
    }
    
    int top() {
        return queue1.front();
    }
    
    bool empty() {
        return queue1.empty();
    }
};

4、工厂设计模式,如何实现,以及它的优点

  1. 工厂设计模式的定义    定义一个创建对象的接口,让子类决定实例化哪个类,而对象的创建统一交由工厂去生产,有良好的封装性,既做到了解耦,也保证了最少知识原则。
  2. 工厂设计模式分类    工厂模式属于创建型模式,大致可以分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。
#include<memory>
#include<iostream>
using namespace std;

class Product{
public:
    virtual void Show() = 0;
};

class CreateProductA : public Product {
public:
    void Show(){
        cout << "create product A" << endl;
    }
};

class CreateProductB : public Product {
public:
    void Show(){
        cout << "create product B" << endl;
    }
};

class SimpleFactory {
public:
    static unique_ptr<Product> CreateProduct(const string& type){
        if(type == "A"){
            return make_unique<CreateProductA>();
        } else if (type == "B"){
            return make_unique<CreateProductB>();
        } else {
            return nullptr;
        }
    }
};

int main(){
    auto ProductA = SimpleFactory::CreateProduct("A");
    ProductA->Show();

    auto ProductB = SimpleFactory::CreateProduct("B");
    ProductB->Show();

    return 0;
}
//优点: 简单工厂模式可以根据需求,动态生成使用者所需类的对象,而使用者不用去知道怎么创建对象,使得各个模块各司其职,降低了系统的耦合性。    
//缺点:就是要增加新的核类型时,就需要修改工厂类。这就违反了开放封闭原则:软件实体(类、模块、函数)可以扩展,但是不可修改。
#include<iostream>
#include<memory>
using namespace std;
class Product{
public:
    virtual void Show() = 0;
};

class CreateProductA : public Product {
public:
    void Show(){
        cout << "create product A" << endl;
    }
};

class CreateProductB : public Product {
public:
    void Show(){
        cout << "create product B" << endl;
    }
};

class Factory{
public:
    virtual unique_ptr<Product> CreateProduct() = 0;
};

class FactoryA : public Factory{
public:
     unique_ptr<Product> CreateProduct(){
        return make_unique<CreateProductA>();
    }
};
class FactoryB : public Factory{
public:
     unique_ptr<Product> CreateProduct(){
        return make_unique<CreateProductB>();
    }
};

int main() {
    unique_ptr<Factory> factoryA = make_unique<FactoryA>();
    auto productA = factoryA->CreateProduct();
    productA->Show();

    unique_ptr<Factory> factoryB = make_unique<FactoryB>();
    auto productB = factoryB->CreateProduct();
    productB->Show();

    return 0;
}
//优点: 扩展性好,符合了开闭原则,新增一种产品时,只需增加改对应的产品类和对应的工厂子类即可。    
//缺点:每增加一种产品,就需要增加一个对象的工厂。如果这家公司发展迅速,推出了很多新的处理器核,那么就要开设相应的新工厂。在C++实现中,就是要定义一个个的工厂类。显然,相比简单工厂模式,工厂方法模式需要更多的类定义。

全部评论

相关推荐

emmm别问我为啥上一条帖子隔了两个月我才开始投简历和拿offer,因为我懒😰简单流程如下:周一凌晨改好的简历,然后到处乱投简历;周二接到了三维家的一面通知,临时抱佛脚的背了一些八股;周三上午一面下午通知第二天hr面;周四上午hr面下午拿offer,遂收手支线:在BOSS上顺手投了几个大厂,投字节的时候不小心投城客户端了,结果过了一天HR突然把我简历要走了,还问我能不能整客户端,我直接一口答应(脏面评警告😢)结果在周三下午的时候给我打电话,说前端有空缺实习岗,问我有没有兴趣,然后就跟我约了周四下午一面😰我都没咋准备啊,咩都不会啊😭结果周四下午面完,晚上打电话通知过一面了,赶紧把二面约在下周一下午,留点缓冲时间。逆大天了,我一半的问题都不会,他居然给我过了?运气未免有点好了😥现在正在恶补计网、网安、性能优化的东西(这三大板块我是几乎一点不会,一面几乎一点答不出来,加上我又没怎么背八股,这块被干烂了😵)心得体会与经验:1.&nbsp;我giao怎么这么快就结束了,我还以为要找好久😨2.&nbsp;大厂的面试问题真的和中厂小厂很大不同,比如在三维家我能自己吹水到vue的数据劫持、Proxy代理响应式之类的他们就觉得很不错了,但是在字节你但凡敢提到一下就会追问你细节了,一追问马脚就全漏出来了3.&nbsp;有信心真的很重要,我感觉我能拿中厂offer最重要的就是吹水吹出自信来了,以至于三维家面试反问面试官有哪里还需要改进的时候,他就说很不错了解的很多😦4.&nbsp;理解很重要,我从头到尾真没背过很多八股,不过有一些知识确实是敲过代码验证过,所以面试的时候能吹水吹得出来😇想了解面经啥的可以直接评论区问我,但我可能也说不全,因为我没有记录,而且今天摆了一天感觉记忆快清空了😵下面是故事时间:我暑假刚开始的时候才开始准备八股,印象很深那个时候连什么原型、事件循环、闭包这些名词都没听过,资料也不知道怎么找,就一直零零散散的准备,感觉也只有js稍微背了一下八股,其他很多时候都是靠完全理解和手写熟悉一些机制的,但这样做效率很低,反正准备了一个多星期半个月就开摆了😭结果一摆就摆到了开学,笔记是乱七八糟的,八股是忘光光的,简历是一直没改的,实习也是一直没投过的。直到上周日晚上偶然和师兄聊天,他突然问我“你怎么还不找实习”,那天晚上才幡然醒悟,是时候做点事情了😡然后就按照上面描述的来走了。其实我感觉我从头到尾都没背特别多八股,也没怎么找刷题资料啥的,早期就是翻尚硅谷或者黑马的入门视频从头学起,中期用面试鸭看了一点点题,主要是在学js机制和敲js代码,后期才发现了w3c的面经网站,然后在那里看着学(那个时候已经懒得敲了,因为有些问题与代码感觉不像是给找实习的看的,忒细了点😂)接下来继续准备字节二面吧,虽然几乎没啥可能可以通过,但是万一有奇迹呢?😍😍😍也祝大家能够早日拿到心仪的offer
我的offer呢😡:我已经预见10天后你会发,节孝子启动了
投递三维家等公司10个岗位
点赞 评论 收藏
分享
notbeentak...:孩子,说实话,选择很重要,可能你换一个方向会好很多,但是现在时间不太够了,除非准备春招
点赞 评论 收藏
分享
评论
点赞
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务