自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 链表中环的入口节点

计算链表中环的节点数和环的入口节点利用快慢指针可以解决这个问题(看下面的代码)//链表的结构类型struct ListNode { int m_val; ListNode* m_pNext;};//找到环中任一节点(快慢节点相遇的节点)ListNode* MettingNode(ListNode* pHead){ if (pHead == nullptr) { return nullptr; } ListNode* pSlow = pHead->m_pNext;

2020-07-28 20:12:32 175

原创 三个线程按顺序打印ABC

线程1打印A、线程2打印B、线程3打印C,依次打印十遍(ABCABCABC…)#include<pthread.h>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<unistd.h>#include<semaphore.h>sem_t sem[3];void* task1(void* arg){ char* name =(char*)

2020-07-28 17:13:13 422

原创 链表中倒数第K个节点

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。class Solution {public: ListNode* getKthFromEnd(ListNode* head, int k) { ListNode* CurrentNode = head; for (int i = 0; i < k;

2020-07-28 16:03:26 169

原创 调整数组顺序使得奇数位于偶数前面

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。原地排序可以直接实现class Solution {public: vector<int> exchange(vector<int>& nums) { int begin = 0; int end = nums.size() - 1; while (begin < end) { while (begin < end)

2020-07-28 15:22:16 121

原创 二进制中1的个数

请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。示例:1输入:00000000000000000000000000001011输出:3解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。示例 2:输入:00000000000000000000000010000000输出:1解释:输入的二进制串 0000000000000

2020-07-28 11:28:34 103

原创 在一个字符串中查找另一个字符串出现的位置

例子实现函数strstr(),功能为:strstr(“12345”,“34”)的返回值为2,在2号位置找到字符串"34";如果找不到则返回-1int strstr(char *str1, char *str2){ int count = 0; while (*str1) { if (*str1 == *str2) { char *p1 = str1; char *p2 = str2; while (*p2) { if (*p2 != *p1) b

2020-07-28 00:01:21 3746

原创 二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。示例 1:输入: nums = [-1,0,3,5,9,12], target = 9输出: 4解释: 9 出现在 nums 中并且下标为 4示例 2:示例 2:输入: nums = [-1,0,3,5,9,12], target = 2输出: -1解释: 2 不存在 nums 中因此返回 -1class Solu

2020-07-27 23:11:43 107

原创 二叉树的基本操作(节点创建、二叉树的创建、遍历、叶子结点的数量、二叉搜索树的插入、二叉搜索树的检索)

二叉树的基本操作(节点创建、二叉树的创建、遍历、叶子结点的数量、二叉搜索树的插入、二叉搜索树的检索)节点创建//节点定义typedef struct BTreeNode{ int data; struct BTreeNode* lchild; struct BTreeNode* rchild;}BTreeNode;typedef BTreeNode* btreenode;//创建节点BTreeNode* CreateNode(int val){ BTreeNode* p

2020-07-27 22:19:03 152

原创 最小栈

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈(力扣题)push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。常数时间内就是指食家复杂度为O(1)//找出栈中最小的元素class MinStack {private: stack<int> *oristack; stack<int> *minstack;public: M

2020-07-27 18:58:15 101

原创 合并两个有序的数组

给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。初始化 A 和 B 的元素数量分别为 m 和 n。示例:输入: A = [1,2,3,0,0,0], m = 3 B = [2,5,6], n = 3输出: [1,2,2,3,5,6]说明:A.length == n + m功能实现class Solution {public: void merge(vector<int>& A

2020-07-26 14:41:58 77

原创 合并两个有序链表

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4功能实现迭代方法实现struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {}};class Solution1 {public: ListNode* me

2020-07-26 14:28:46 90

原创 链表的基本操作:初始化、创建链表、创建节点、节点插入、节点删除、链表长度、反转链表、是否有环、环的入口、链表置空、链表中间节点

链表的基本操作链表的初始化//链表的结构类型struct ListNode { int m_val; ListNode* m_pNext;};//这里是没有头指针的情况下的初始化ListNode* List_init(){ ListNode * pHead = (ListNode*)malloc(sizeof(ListNode)); if (pHead == nullptr) { printf("创建节点失败"); return pHead; } pHead->m_

2020-07-25 21:05:14 974

原创 二维数组中的查找

在一个 n * m的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]给定 target = 5,返回 tru.

2020-07-09 21:40:50 124

原创 请实现一个函数,把字符串 s 中的每个空格替换成“%20“

请实现一个函数,把字符串 s 中的每个空格替换成"%20"示例:输入:s = "We are happy."输出:"We%20are%20happy."功能实现class Solution {public: string replaceSpace(string s) { string::iterator it = s.begin(); while (it != s.end()) { if (*it == ' ') { s.erase(it); s.i

2020-07-09 13:48:29 682

原创 在一个长度为 n 的数组里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

在一个长度为 n 的数组里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3 功能实现class Solution {public: int findRepeatNumber(vector<int>& nums) { vector<int> num(nums.size(),0);

2020-07-08 19:08:32 934

原创 合并两个有序升序的整数数组A和B变成一个新的数组。新数组也要有序。

合并两个有序升序的整数数组A和B变成一个新的数组。新数组也要有序样例 1:输入: A=[1], B=[1]输出:[1,1] 样例解释: 返回合并后的数组样例 2:输入: A=[1,2,3,4], B=[2,4,5,6]输出: [1,2,2,3,4,4,5,6] 样例解释: 返回合并后的数组。第一种方法功能实现class Solution {public: vector<int> mergeSortedArray(vector<int> &

2020-07-07 12:16:09 631

原创 计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值

计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值样例样例 1:输入:k = 1, n = 1输出:1解释:在 [0, 1] 中,我们发现 1 出现了 1 次 (1)。样例 2:输入:k = 1, n = 12输出:5解释:在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 中,我们发现 1 出现了 5 次 (1, 10, 11, 12)(注意11中有两个1)。功能实现class Solution {publi

2020-07-05 19:09:37 341

原创 设计一个算法,计算出n阶乘中尾部零的个数

设计一个算法,计算出n阶乘中尾部零的个数样例 1:输入: 11输出: 2样例解释: 11! = 39916800, 结尾的0有2个。样例 2:输入: 5输出: 1样例解释: 5! = 120, 结尾的0有1个。class Solution{public: long long trailingZeros(long long n) { int temp = multi(n); int count = 0; while((temp % 10) == 0) {

2020-07-03 23:26:34 179

原创 C语言示例八(Linuc C链表实现):写一个通讯录,可以实现添加、删除、查找、列表展示、修改等功能

函数声明#ifndef LINK_H_#define LINK_H_typedef struct { char username[10]; char tel[11]; struct Node *prev; struct Node *next;}Node;typedef struct { int size; Node *head; Node *tail; }Link;void addFirst(Link* lp,char username[10],ch

2020-06-30 18:51:04 247

原创 C语言示例七:打印二维数组,并取出其中的某个元素

打印二维数组,并取出其中的某个元素#include<stdio.h>int main(){ int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int i,j; for(i=0;i<3;i++){ for(j=0;j<4;j++){ printf("%d ",a[i][j]); } printf("\n"); } printf("%d\n",*(*a+3)); printf("%d\n",*((*a+1)+

2020-06-30 10:17:51 2365

原创 C语言示例五:将一个数转换成任意进制的数(数组实现)

将一个数转换成任意进制的数(数组实现)void translate(int n,int base){ char b[50]; memset(b,0,sizeof(b)); int i=0; while(n){ b[i]=n%base; if(b[i]>9){ b[i] += 'A'-10; }else{ b[i] +='0'; } n=n/base; i++; } while(i--){ printf("%c",b[i]); }}int m

2020-06-30 09:59:39 637

原创 C语言示例四:将一个整数转换成字符串

将一个整数转换成字符串#include<stdio.h>#include<string.h>void itoa(char s[],int n){ memset(s,0,sizeof(s)); int i=0; while(n){ s[i]=n%10; s[i]+='0'; n/=10; i++; } int len=i; while(--i){ if(i>len/2){ int temp=s[i]; s[i]=s[len-i-

2020-06-30 09:53:10 3215

原创 C语言示例二:在字符串数组中的指定位置插入字符

在字符串数组中的指定位置插入字符int insert(char a[],int len,int index,int value){ if(index<0||index>=len){ printf("the index illeagal!\n");\ return -1; } int i=len-1; for(;i>=index;i--){ a[i+1]=a[i]; } a[index]=value; return 0;}int main(){ char

2020-06-30 09:35:57 3268

原创 C语言示例一:利用函数指针数组编写一个计算器(能够实现加减乘除)

利用函数指针数组编写一个计算器(能够实现加减乘除)#include<stdio.h>int add(int a,int b){ return a+b;}int minus(int a,int b){ return a-b;}int mutiple(int a,int b){ return a*b;}int devide(int a,int b){ return a/b;}int (*fn[])(int,int)={add,minus,mutiple,devi

2020-06-30 09:31:22 1110

原创 C++的模板(二)类模板示例三:(栈实现)将输入的一个数(十进制)以任意进制(二进制、八进制、十六进制)输出

#include <iostream>#include <cstdio>#include <cstdlib>using namespace std;template <typename T>class Stack{private: int size; int max_size; T *tp;public: Stack(int size){ max_size=size; tp=new T[size]; this->

2020-06-29 20:17:07 452

原创 C++的模板(二)类模板示例二:向栈中写入数据,再打印出来

栈的特点:后进先出template <typename T>class Stack{private: int size; int max_size; T *tp;public: Stack(int size=10){ max_size=size; tp=new T[size]; this->size=0; } ~Stack(){ delete tp; } T push(T dat){ if(size==max_size){ prin

2020-06-29 20:09:48 152

原创 C++的模板(二)类模板示例一:(队列实现)有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡是报到3的人退出圈子,问最后留下来的是原来的第几位

类模板C++除了支持函数模板,还支持类模板,此时类模板中定义的类型参数可以用在类声明和类实现中,类模板的目的同样是将数据的类型参数化

2020-06-29 19:50:41 689

原创 C++的模板(一)函数模板

函数模板1、建立一个通用函数,不过其函数类型和形参类型不具体指定,用一个虚拟的类型的来代表,这样的函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不需要定义多个函数,只需要在模板中定义一次就可以了2、在函数模板中,数据的值和类型都被参数化了,在函数调用时编译器会根据传入的实参来推演形参的值和类型3、模板的使用格式如下4、模板没有被使用时,是不会被实例化出来的5、一般讲模板的声明和实现声明和实现放在.hpp文件中6、模板的声明和实现分离到.h和.cpp,会导致链接错误先看下.

2020-06-28 10:59:50 137

原创 C++的运算符重载(二)加号、减号、复制、加等于、等于、不等于、负号、 左移、右移、前置++、后置++等的重载

首先讲下 a++ 和 ++a 的区别a++是先取值后运算,++a是先运算后取值#include <iostream>using namespace std;class Point {private: int m_x; int m_y;public: Point(){} Point(int x,int y):m_x(x),m_y(y){} void Display(){ cout << "(" << m_x << "," &l..

2020-06-26 21:20:45 5107

原创 C++的运算符重载(一)运算符重载的定义及注意事项

运算符重载(操作符重载)1、根据用户的需求,可以为运算符增加一些新的功能,赋予新的含义2、运算符重载的格式3、并不是所以的运算符都可以实现重载4、有些运算符只能重载为成员函数 ,例如=、[ ]、()、->5、运算符重载函数可以是类的成员函数,由于类的普通成员函数本身就有一个指向对象的指针this所以单目运算符不需要参数,双目运算符的参数只有一个。也可以是全局函数(一般需要在类中声明该函数为友元函数)6、运算符重载函数不能用默认参数,否则会改变运算操作符的个数7、运算符重载不会改变原来.

2020-06-26 15:34:05 2077

原创 C++的纯虚函数和抽象类示例:创建一个动态数组,可以实现增加、删除、查找、计算长度、打印等功能

创建一个动态数组,可以实现增加、删除、查找、计算长度、打印等功能#include <iostream>#include <cstdio>using namespace std;class List{public: virtual void add(int dat)=0; virtual int get(int index)=0; virtual int size()=0; virtual void display()=0; virtual int remove

2020-06-25 22:23:31 462

原创 C++的继承和派生(五)纯虚函数和抽象类

在上一篇提到了虚函数,可以发现,虚函数并没有实现相应的功能,只是提供了类似于接口的功能。所以在C++中可以将虚函数声明为纯虚函数,其语法格式为:virtual 返回值类型 函数名 (函数参数)=0;说明:1、纯虚函数没有函数体,只有函数声明,在虚函数声明的结尾加上 “=0”,表明此函数是纯虚函数2、包含纯虚函数的类称为抽象类,抽象类无法创建对象3、抽象类也可以包含非纯虚函数、成员变量4、如果父类是抽象类,子类没有完全重写纯虚函数,那么这个子类依然是纯虚函数5、只有类中的虚函数才可以被定义为虚

2020-06-25 20:53:33 502

原创 C++的继承和派生(四)多态的实现和虚函数

C++的多态有四种:1、强制多态:函数重载和运算符重载(后面讲解)2、强制多态:强制类型转换3、包含多态:利用虚函数实现,在子类中重写函数,实现动态绑定4、参数多态:与类模板相关联(后面讲解)本篇所要讲解的是包含多态,由于是在继承的基础上实现的,所以就干脆放在继承和派生这一专题了在介绍多态前,请看下面一段代码class Dog {public: void run() { cout << "Dog-run()" << endl; } void sp..

2020-06-25 18:01:37 255

原创 C++的继承和派生(三)虚继承和虚基类、虚继承时的构造函数

虚继承和虚基类的概念多继承多继承是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的所有的成员,但是多继承很容易造成命名冲突的问题,例如典型的菱形继承如上图所示,假设当类A中有一个成员变量a,那么在D类中直接访问就会产生歧义,因为编译器不知道成员变量 a 的来源途径是什么(A→B→D还是A→C→D)。不仅如此,类A在类D 中存在两份数据,那么构造D类的对象时,就必须对这两份数据经行初始化,此时来A 的构造函数就会调用两次。为了解决多继承时的成员冗余、重复和命名冲突的问题,C++提

2020-06-25 15:34:10 756

原创 C++的继承和派生(二)派生类的构造函数和析构函数

标题

2020-06-25 13:26:28 626

原创 C++的继承和派生(一)父类和派生类(子类)的介绍以及派生类的访问控制

在介绍继承和派生之前,先看下面一段代码在这里插入代码片

2020-06-24 23:35:29 10845

原创 C++的静态成员变量和静态成员函数和static关键字

静态成员变量静态成员变量:被 static 修饰的成员变量叫做静态成员变量1、静态成员变量存储在数据段(全局区,类似于全局变量),整个程序运行过程中只有一份内存2、对比于全局变量,它可以设定访问权限(public、protected、private),以达到数据共享的目的3、静态成员变量必须要在类外初始化(没有初始化则不能使用),初始化不能加static,但需要加上类名4、可以通过(对象.静态成员)、(对象指针.静态成员)、(类名::静态成员)来访问。通过不同对象访问时,访问的都是同一块内存

2020-06-23 21:50:23 267

原创 C++的友元函数和友元类

友元包括友元函数和又元类友元函数在类外定义的函数,可以在在类内进行声明,但要在前面加上关键字friend,这样就构成了友元函数友元函数可以是不属于任何类的成员函数,也可以是其他类的成员函数友元函数可以访当前类中的所有成员(private、public、protected)友元函数会破坏面向对象的封装性,但是在某些频繁访问成员变量的地方可以提高性能-------------------------------------------将两个点相加-------------------------

2020-06-23 18:56:58 127

原创 C++的构造函数和析构函数(六)浅拷贝和深拷贝

浅拷贝编译器默认的提供的拷贝就是浅拷贝1、将一个对象的中的所有成员变量的值拷贝到另一个对象(上一篇博客)2、如果某个成员变量是个指针,只会拷贝指针中存储的地址值,并不会拷贝指针指向的内存空间3、可能会导致堆空间多次free的问题深拷贝当类中有指针类型时,此时需要进行深拷贝,这时就要自定义拷贝构造函数将指针类型的成员所指向的内存空间拷贝到新的内存空间,也就是进行堆上的空间复制浅拷贝程序分析class Student { int m_age; char *m_name;pub

2020-06-23 16:22:51 256

原创 C++的构造函数和析构函数(五)拷贝构造函数和默认构造函数

拷贝构造函数拷贝构造函数是构造函数的一种拷贝构造函数的格式是固定的,接收一个const引用作为参数当利用已存在的对象创建一个新对象时(类似于拷贝),就会调用新对象的拷贝构造函数进行初始化class Person{public: int m_age; int m_height; //构造函数 Person(int age,int height):m_age(age),m_height(height){ cout << "构造函数被调用" <<endl; }

2020-06-23 13:48:43 268

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除