面试准备

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++实现中,就是要定义一个个的工厂类。显然,相比简单工厂模式,工厂方法模式需要更多的类定义。

全部评论

相关推荐

Git的工作流程通常包括以下几个步骤:https://www.nowcoder.com/issue/tutorial?zhuanlanId=Mg58Em&amp;amp;uuid=f818c6d22c98401682f8662612b9e57f克隆(Clone):首先,通过克隆一个远程仓库到本地,创建一个本地仓库的副本。这样可以在本地进行开发和修改。添加和修改(Add&nbsp;and&nbsp;Modify):在本地仓库中进行代码的添加和修改。开发者可以通过添加新文件、修改现有文件或删除文件来进行开发工作。暂存(Stage):将修改的文件添加到暂存区(也称为索引),准备提交到版本库。暂存区相当于一个缓冲区,用于存放即将提交的修改。提交(Commit):将暂存区的修改提交到版本库。每次提交都会生成一个唯一的提交记录,包含了修改的详细信息,如作者、时间戳和提交消息。推送(Push):将本地的提交推送到远程仓库,与团队成员共享代码。推送操作将本地的提交同步到远程仓库,使得其他人可以看到和使用这些修改。拉取(Pull):从远程仓库拉取最新的代码更新到本地仓库。当其他人推送了新的修改到远程仓库时,开发者可以通过拉取操作获取这些更新。合并(Merge):将不同分支的修改合并到一起。当开发者在不同的分支上进行并行开发时,可以使用合并操作将分支的修改合并到主分支或其他分支上。冲突解决(Conflict&nbsp;Resolution):当多个分支对同一文件进行了不同的修改时,可能会发生冲突。开发者需要手动解决这些冲突,选择保留哪些修改或进行修改的合并。这些步骤构成了Git的基本工作流程。通过这个工作流程,开发者可以有效地管理代码的版本、协作开发和跟踪修改历史。
点赞 评论 收藏
分享
点赞 3 评论
分享
牛客网
牛客企业服务