![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
草莓感冒片
~~~
展开
-
字符串逆序
利用逆向迭代器string reverse(const string& str){ if (str.empty()) return string("null"); string s(str.rbegin(), str.rend()); return s;}原地逆序 C++中string类型支持下标访问,再利用std::swap() 函数可以进行两个字符的交换,避免额...原创 2018-01-29 15:02:15 · 202 阅读 · 0 评论 -
拓扑结构相同子树
对于两棵彼此独立的二叉树A和B,请编写一个高效算法,检查A中是否存在一棵子树与B树的拓扑结构完全相同。给定两棵二叉树的头结点A和B,请返回一个bool值,代表A中是否存在一棵同构于B的子树。分析 利用二叉树的遍历先将二叉树的每个节点放在数组中。接着进行字符的匹配。示例struct TreeNode { int val; struct TreeNode ...原创 2018-08-26 15:56:25 · 480 阅读 · 0 评论 -
重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 在二叉树的前序序列中,第一个数字总是树的根节点值。在中序序列中,左子树的节点的值位于根节点的左边,右子树的节点的值位于根节点的右边。...原创 2018-08-17 15:26:40 · 102 阅读 · 0 评论 -
两串旋转
如果对于一个字符串A,将A的前面任意一部分挪到后边去形成的字符串称为A的旋转词。 比如A=”12345”,A的旋转词有”12345”,”23451”,”34512”,”45123”和”51234”。对于两个字符串A和B,请判断A和B是否互为旋转词。 给定两个字符串A和B及他们的长度lena,lenb,请返回一个bool值,代表他们是否互为旋转词。 测试样例: “cda...原创 2018-08-27 13:00:19 · 154 阅读 · 0 评论 -
句子的逆序
对于一个字符串,请设计一个算法,只在字符串的单词间做逆序调整,也就是说,字符串由一些由空格分隔的部分组成,你需要将这些部分逆序。 给定一个原字符串A和他的长度,请返回逆序后的字符串。 测试样例: “dog loves pig”,13 返回:”pig loves dog”示例一class Reverse {public: string rev...原创 2018-08-27 13:58:48 · 284 阅读 · 0 评论 -
栈的应用-数制转换
数制转换 根据栈的先进后出的特性,可以用栈来改变顺序。如将十进制数m转换为n进制的结果。 将m连续除以n,所得余数依次是n进制由低位到高位的值,但输出结果却要由高位到低位,因此,借助栈来改变顺序。/*进制转换*/void Conversion(int m, int n) { SequenceStack<int> S(5); int e; c...原创 2018-08-25 11:04:14 · 4759 阅读 · 0 评论 -
C++string中substr
string substr(size_type _Off = 0,size_type _Count = npos) const;参数_Off:所需的子字符串的起始位置。字符串中第一个字符的索引为 0,默认值为0。 _Count:复制的字符数目。 返回值:一个子字符串,从其指定的位置开始。示例string str("helloworld");string strSu...原创 2018-08-25 11:14:18 · 10694 阅读 · 0 评论 -
打印从1到最大的n位数
输入数字n,按顺序打印从1到最大的n位十进制数。比如输入3,则打印1、2、3一直到最大的3位数999class PrintMaxNumber {public: PrintMaxNumber(int i = 1) :n(i) {} void Print1ToMaxOfN();private: bool Increment(char *number); ...原创 2018-08-25 20:10:27 · 296 阅读 · 0 评论 -
对a变量进行定义
一个整型数int a;一个指向整型数的指针int *a;一个指向指针的指针,它指向的指针是一个整型数int **a;一个有10个整型数的数组int a[10];一个有10个指针的数组,该指针是指向一个整型数int *a[10];一个指向有10个整型数数组的指针int (*a)[10];一个指向函数的指针,该函数有一个整型参数并...原创 2018-09-08 20:05:30 · 629 阅读 · 0 评论 -
字符串移位
对于一个字符串,请设计一个算法,将字符串的长度为len的前缀平移到字符串的最后。 给定一个字符串A和它的长度,同时给定len,请返回平移后的字符串。 测试样例: “ABCDE”,5,3 返回:”DEABC”示例class Prior {public: string findSmallest(vector&lt;string&gt; strs...原创 2018-09-06 13:27:49 · 749 阅读 · 0 评论 -
可查询最值的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。示例class Solution {public: void push(int value) { stackData.push(value); if (stackMin.empty() || value < stackMin.top()) ...原创 2018-09-06 13:32:28 · 115 阅读 · 0 评论 -
C++拷贝构造函数
默认构造函数 默认的构造函数存在一定的弊端,属于浅拷贝。比如指针的简单的指向一个变量。class Base {public: Base(int a = 0){ cout << "default constructor" << endl; p = new int(a); } ~Base(){ ...原创 2018-09-15 20:01:07 · 1903 阅读 · 0 评论 -
C++运算符重载
若对象内包含指针,将造成不良后果:指针的值被丢弃了,但指针指向的内容并未释放。指针的值被复制了,但指针所指内容并未复制。 因此,包含动态分配成员的类除提供拷贝构造函数外,还应该考虑重载”=”赋值操作符号。 Base & operator = (const Base &base);/*声明*/Base & Base::operator=(const B...原创 2018-09-15 20:09:27 · 186 阅读 · 0 评论 -
C++基类子类的析构函数
基类的析构函数不为虚函数class Base {public: Base(int a = 0) { cout &lt;&lt; "Base default constructor" &lt;&lt; endl; p = new int(a); } ~Base() { cout &lt;&lt; &原创 2018-09-15 20:31:01 · 4911 阅读 · 0 评论 -
静态链表
静态链表存储于数组中,但其顺序不是按数组下标的顺序,而是像链表一样,由当前结点link域的值决定下一个结点的位置,这是链表的特性。由于存储于数组中,故称为静态链表。静态链表与单链表的区别 单链表的结点通过new产生,结点被限制在动态存储区内。因此,指示结点位置的指针类型是长整型。而静态链表的结点被限制在静态数组内。因此,指示结点位置的指针(link成员)是整型。 单链表中不...原创 2018-08-19 15:32:34 · 570 阅读 · 0 评论 -
单链表
单链表节点类型结构体#ifndef __LISTNODE_H__#define __LISTNODE_H__template<typename T> struct LNode{ T data; LNode<T> *next;};#endif单链表的类#ifndef __LINKLIST_H__#define __LI...原创 2018-08-19 14:50:36 · 136 阅读 · 0 评论 -
智能指针——auto_ptr与shared_ptr
auto_ptr auto_ptr是当年C++标准库中提供的一种智能指针。auto_ptr在构造时获取某个对象的所有权,在析构时释放该对象。可以提高代码的安全性。例如:int *p = new int(0);auto_ptr<int> ap(p); auto_ptr主要是解决被异常抛出时发生资源泄露问题。 注意: 1)auto_ptr析构的时候...原创 2018-01-26 17:14:10 · 253 阅读 · 0 评论 -
简单工厂模式
简单工厂模式 简单工厂模式并不属于GoF的23种设计模式。例子: 假如存在一个水果类Fruit:该类有一个带参数的构造函数,用来初始化水果名称;还有一个获取水果名称的成员函数。 Fruit(string name) { this->name = name; if (name == "apple") { //代表苹果 } else i...原创 2018-07-24 15:56:19 · 175 阅读 · 0 评论 -
工厂方法模式
模式中的角色和职责抽象工厂(Abstract Factory)角色:工厂方法模式的核心,任何工厂类都必须实现这个接口;工厂(Concrete Factory)角色:具体工厂类是抽象工厂的一个实现,负责实例化产品对象;抽象(Abstract Product)产品:工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口;具体产品(Concrete Product)角...原创 2018-07-24 19:58:05 · 123 阅读 · 0 评论 -
抽象工厂模式
抽象工厂模式工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产。产品族与产品等级结构模式中的角色和职责抽象工厂(Abstract Factory)角色:它声明了一组用于创建...原创 2018-07-24 20:14:22 · 252 阅读 · 0 评论 -
C++常见面试题(二)
C++常见面试题(一)死锁的必要条件 互斥条件,请求和保持条件,不剥夺条件,环路等待条件。解决死锁的基本方法 预防死锁,避免死锁,检测死锁,解除死锁。程序在内存中的分布 text:只读,存代码和一些其他的东西; data:存初始化的全局变量和static变量,文字常量区,常量字符串。 bss:存未初始化的全局变量和statci变量。 堆:由低地址...原创 2018-07-28 20:05:49 · 226 阅读 · 0 评论 -
单例模式
模式意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点。要点 某个类只能有一个实例; 它必须自行创建这个实例; 它必须自行向整个系统提供这个实例。工作原理 用一个特殊方法来实例化所需的对象。 调用这个方法时,检查对象是否已经实例化。若已经实例化,该方法仅返回对该对象的一个引用。若未实力哈,该方法实例化该对象并返回对此新实例的一个引用。 为了...原创 2018-07-26 14:21:20 · 156 阅读 · 0 评论 -
单例模式----打印机
单例模式介绍#include <iostream>#include <string>using namespace std;class printer {public: static printer *getInstance() { return instance; } void print(string text) { cout <&l...原创 2018-07-26 14:31:55 · 1153 阅读 · 0 评论 -
快速排序
快速排序 对于C++,快速排序是实践中已知最快的泛型排序算法。它的平均运行时间是O(NlogN)。基本思想原理 若序列中有n个元素,将第一个数据作为支点,将它放在表中合适的位置。以支点为界,序列分成两部分。其中左边数据小于等于支点,右半部分数据大于等于支点。然后,对左右两部分分别进行递归处理,直至排好序为止。将支点放在表合适位置—划分算法 设两个指针,i和...原创 2018-07-29 18:44:03 · 170 阅读 · 0 评论 -
抽象工厂模式---电脑主板架构案例
要求设计一个电脑主板架构,电脑包括(显卡,内存,CPU)3个固定的插口,显卡具有显示功能(display,功能实现只要打印出意义即可), 内存具有存储功能(storage),cpu具有计算功能(calculate)。 现有Intel厂商,nvidia厂商,Kingston厂商,均会生产以上三种硬件。 要求组装两台电脑, ...原创 2018-07-26 15:14:13 · 785 阅读 · 0 评论 -
C++常见面试题(一)
结构体、类、共用体 结构体:把不同类型的数据组合成一个整体,自定义类型,默认为public; 类:将数据表示和操纵数据的方法组合成一个整洁的包,默认为private; 共用体:让不同类型的变量共用一段内存,只能同时存储其中一种类型。内存对齐 结构体或类的自身对齐值:其成员中自身对齐值最大的; 指定对齐值:#pragma pack(n),n=1,2,4,8,16改变...原创 2018-07-28 16:31:39 · 531 阅读 · 0 评论 -
插入排序
插入排序概念void InsertSort(int *arr, int len) { for (int i = 1; i < len; i++) { int tmp = arr[i]; int j; for (j = i; j > 0 && tmp < arr[j - 1]; j--) { arr[j] = arr[j - 1]; ...原创 2018-07-23 09:27:03 · 118 阅读 · 0 评论 -
二维数组中的查找
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。分析 选取数组中右上角的数字。 若该数字等于要查找的数字,则查找结束; 若该数字大于要查找的数字,则剔除这个数字所在的列; 若该数字小于要查找的数字,则剔除这个数字所在的行。 若选取数组中...原创 2018-08-26 11:47:42 · 111 阅读 · 0 评论 -
替换空格
请实现一个函数,把字符串中的每个空格替换成”%20”。如,输入”We are happy.”,则输出”We%20are%20happy.”。分析 先遍历一次字符串,统计出空格数。并算出替换后的字符串的总长度。每替换一个空格,字符串长度增加2。示例void ReplaceBlankSpace(char *str, int len){ if (nullpt...原创 2018-08-26 13:47:25 · 143 阅读 · 0 评论 -
查找数组中的众数
查找数组中出现次数最多的数示例一int most_(vector&lt;int&gt; arr) { int len = arr.size(); vector&lt;int&gt; tmp(len, 0); vector&lt;int&gt;::iterator it = arr.begin(); while (it != arr.end()) { tmp[*it++]++; }原创 2018-10-02 14:44:24 · 3214 阅读 · 0 评论