自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 (快速排序)

快速排序思想:先在数据中找一个基准数据 : 找待排序数据序列的第一个, 随机数, 三位数取中将数据按照基准数据分成两部分,前一段都比基准小,后一段都比基准大。按照同样的思想分别处理前一段和后一段数据。思考的两个问题:(1)处理一段数据时,什么样的情况就认为这一段数据已经完全有序(2) 如何将数据按照基准分成两部分按照一个基准数据,将待排序数据段分成两部分数据段为low到high之间的数据。先将基准数据(low位置)保存到tmp中,i=low,j = high。 在i<j的时候,重复

2021-10-14 23:59:19 118

原创 (剑指offer)最小的k个数

最小的k个数题目描述:输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。示例:输入:arr=[1,2,5,6,7,89,9,10],k=3输出:[1,2,5]或[5,2,1]思路:将原数组排序,用新数组来存储k小的数。 vector<int> getLeastNumbers(vector<int>& arr, int k) { vector<int>

2021-10-12 23:38:03 88

原创 (剑指offer)扑克牌中的顺子

扑克牌中的顺子题目描述:从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。示例1:输入:[1,2,3,4,5]输出:true示例2:输入:[1,2,2,3,4]输出:false思路:1.先将数组排序。2.判重。 排序数组中的相同元素位置相邻,因此可通过遍历数组,判断 nums[i] = nums[i + 1] 是否成立来判重。3.排序后,找到最

2021-10-12 23:16:26 99

原创 数组和链表的区别

数组和链表的区别以及各自的优缺点1.数组和链表的区别:(1)数组的元素个数是固定的,而链表的结点个数可按需要增减。(2)数组元素的存储单元在定义时分配,链表节点的存储单元在执行时动态向系统申请。(3)数组的元素顺序关系由元素在数组中的位置(即下标)确定,链表中的节点关系由节点所包含的指针来体现。(4)对于不是固定长度的列表,用可能最大长度的数组来描述,会浪费许多的存储空间。(5)对于元素的插入、删除操作非常频繁的列表处理场合,用数组表示列表也不是不合适。若用链表实现,会使程序结构清晰,处理的方法

2021-10-12 19:27:06 6593

原创 (剑指offer)合并两个排序的链表

合并两个排序的链表题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4ListNode* mergeTwoLists(ListNode* l1, ListNode* l2){ if (l1 == nullptr) return l2; if (l2 == nullptr) return l1; ListNode* l3 =

2021-10-01 16:19:55 54

原创 (剑指offer)链表中倒数第k个节点

链表中倒数第k个节点题目描述:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.思路:最简单直接的方法即为顺序查找,假设当前链表的长度为 n,则我们知道链表的倒数第 k个节点即为正数第

2021-10-01 15:44:56 67

原创 (剑指offer)删除链表的节点

删除链表的节点题目描述:给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。思想:本题是删除val值,分为两步:定位节点和修改引用。1.定位节点:遍历链表,直到找到head->val==val值时跳出,即可找到目标节点。2.修改引用: 设节点 cur 的前驱节点为 pre ,后继节点为 cur.next ;则执行 pre.next = cur.next ,即可实现删除 cur 节点。算法流程:特例处理: 当应删除头节点 head 时,直接返回 h

2021-10-01 15:40:39 107

原创 (剑指offer) 股票的最大利润

股票的最大利润题目描述:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?思路:我们需要找出给定数组中两个数字之间的最大差值(即,最大利润)。此外,第二个数字(卖出价格)必须大于第一个数字(买入价格)。形式上,对于每组 i和 j(其中 j > i)我们需要找出 max(prices[j] - prices[i])。1.暴力法:int maxProfit(vector<int>& prices) { int n =

2021-09-26 17:09:22 57

原创 (剑指offer)青蛙跳台阶问题

青蛙跳台阶问题题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。思路:设跳上 nn 级台阶有 f(n)f(n) 种跳法。在所有跳法中,青蛙的最后一步只有两种情况: 跳上 1级或 2级台阶。当为 1级台阶: 剩 n-1个台阶,此情况共有 f(n-1)种跳法;当为 2级台阶: 剩 n-2个台阶,此情况共有 f(n-2)种跳法。f(n)f(n) 为以上两种情况之和,即 f(n)=f(n-1)+f(n-2),以上递推性质为斐波那契数列。本题可转化为

2021-09-26 16:31:40 50

原创 (剑指offer)对称的二叉树

对称的二叉树题目描述:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:bool isSymmetric(TreeNode* root) { //如果是空树 if (!root) { return true; } return Helper(root->left, root->right);}/

2021-09-26 16:10:13 55

原创 (剑指offer)树的镜像

树的镜像题目描述:请完成一个函数,输入一个二叉树,该函数输出它的镜像。输入例如:镜像输出:思路:我们从根节点开始,递归地对树进行遍历,并从叶子节点先开始翻转得到镜像。如果当前遍历到的节点root 的左右两棵子树都已经翻转得到镜像,那么我们只需要交换两棵子树的位置,即可得到以 root 为根节点的整棵子树的镜像。代码如下:TreeNode* mirrorTree(TreeNode* root) { if (root == nullptr) { return nullptr; } Tr

2021-09-26 15:26:15 55

原创 (剑指offer)树的子结构

树的子结构题目描述:输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:给定的树A:给定的树B:返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。思路:若树 B 是树 A 的子结构,则子结构的根节点可能为树 AA 的任意一个节点。因此,判断树 B是否是树 A 的子结构,需完成以下两步工作:1.先序遍历树 A中的每个节点 ;(对应函数 isSubStructure(A, B))2.判

2021-09-26 15:00:38 56

原创 (剑指 Offer)旋转数组的最小数字

旋转数组的最小数字把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。思想:找到第一个变小的元素,如果找不到就是第一个。 int minArray(vector<int>& numbers) { int tmp=numbers[0]; for(int i=0;i<numbers.

2021-09-23 19:14:35 52

原创 (剑指offer)第一个只出现一次的字符

第一个只出现一次的字符题目描述:在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。思想:我们可以对字符串进行两次遍历。在第一次遍历时,我们使用哈希映射统计出字符串中每个字符出现的次数。在第二次遍历时,我们只要遍历到了一个只出现一次的字符,那么就返回该字符,否则在遍历结束后返回空格。 char firstUniqChar(string s) { unordered_map<int, int> frequency; for (

2021-09-23 19:06:58 66

原创 (剑指offer)0~n-1中缺失的数字

0~n-1中缺失的数字题目描写:一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。思想:遍历数组即可。int missingNumber(vector<int>& nums) { for(int i=0;i<nums.size();++i) { if(nums[i]!=i) {

2021-09-22 22:40:21 51

原创 (剑指offer)在排序数组中查找数字 I

在排序数组中查找数字 I题目描述:统计一个数字在排序数组中出现的次数。思想:遍历数组,利用tmp记录与target相等的数组,记录一次tmp+1; int search(vector<int>& nums, int target) { int i=0; int tmp=0; for(;i<nums.size();++i) { if(nums[i]==target) {

2021-09-22 22:29:18 54

原创 (剑指offer)数组中重复的数字

数组中重复的数字题目描述:找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。思想:在一个长度为 n 的数组 nums 里的所有数字都在 0 ~ n-1 的范围内 。 此说明含义:数组元素的 索引 和 值 是 一对多 的关系。因此,可遍历数组并通过交换操作,使元素的 索引 与 值 一一对应(即 nums[i] = inums[i]=i )。因而,就

2021-09-22 21:33:42 101

原创 (剑指offer)左旋转字符串

左旋转字符串题目描述:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。思想:使用substr (俗称:字符截取函数)函数格式 :  格式1: substr(string string, int a, int b);  格式2:substr(string string, int a) ;  将字符串倍增成为两个同样的字符串拼接的长字符串然后想旋转

2021-09-21 17:08:16 46

原创 (力扣)反转链表

反转链表题目描述:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。方法1:利用栈来实现ListNode* reverseList(ListNode* head){ stack<int> st; ListNode* p = head; while (p != nullptr) { st.push(p->val); p = p->next; } p = head; while (p != nullptr) { p->val

2021-09-20 18:02:34 94

原创 从尾打印链表

从尾打印链表题目描述:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。思路:栈的特点是后进先出,即最后压入栈的元素最先弹出。考虑到栈的这一特点,使用栈将链表元素顺序倒置。从链表的头节点开始,依次将每个节点压入栈内,然后依次弹出栈内的元素并存储到数组中。非递归class Solution {public: vector<int> reversePrint(ListNode* head) { if (!head) return {}; stack&l

2021-09-20 16:10:13 61

原创 斐波那契数列

斐波那契数列斐波那契数列(Fibonacci):第1,2两个数为1,1。从第三个数开始,该数是其前面两个数之和。非递归:int fib(int n){ int a = 1; int b = 0; if (n < 0) { return 0; } else if(n==1||n==2) { return 1; } for (int i = 1; i < n; i++) { a = a + b; b = a - b; } return a;}递归

2021-09-19 19:50:23 219

原创 二维数组中的查找

二维数组的查找题目描述:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。例如:下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字7,则返回true;如果查找数字5,由于数组不含有该数字,则返回false。思路:首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在的列;如果该数字小

2021-09-19 16:10:38 139

原创 字符串空格替换

字符串空格替换请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路:我们从后往前开始替换,首先遍历一遍字符串,统计出空格的个数,并由此能够计算出替换之后的字符串的长度。举个例子:每替换一个空格,长度增加2,因此替换以后字符串的长度等于原来的长度加上2乘以空格数目。以"We are happy"为例,“We are happy"这个字符串的长度为14(包括结尾符号”\n"),里面有两个空格,因此替

2021-09-19 16:03:37 355

原创 堆排序和建立

堆的建立和堆排序将数组中的数据调整成堆时,从最后一棵子树开始,向根节点一颗颗调整 每棵子树的调整都是从其根节点开始向下调整的。一棵子树的调整过程:先用i指向子树的根节点,j为根节点的左孩子。将i位置的值保存到tmp中, 然后在左右孩子中找到较大的哪一个,j指向较大值,(1)如果较大的哪一个比临时变量中的值小,则直接退出;(2)如果较大的哪一个比临时变量中的值大,则将较大的值保存到i位置上,然后i=j,j=2*i+1,直到j越界则退出。退出以后,还需要将tmp的值保存到退出时的i位置上。代码实现:#

2021-09-17 17:43:02 94

原创 不定长顺序表

不定长顺序表1、不定长顺序表-------动态数组 Go 切片 Python 列表存储的数据元素的空间大小是不固定的,可以随着用户的操作动态扩充存储空间2、不定长顺序表的实现2.1结构声明typedef int ElemType;typedef struct SqList{ ElemType* data; //指向申请的堆区空间首地址 int length; //记录当前存储的数据元素个数 int size; //存储当前空间的大小}SqList;2.

2021-06-06 10:37:20 51

原创 三个多线程的输出

多线程使用:有三个线程,要使其输出是ABCABCABC.#include <iostream>#include <thread>#include <mutex>#include <condition_variable>using namespace std;std::mutex mtx;std::condition_variable cv;int isReady=0;//如果isReady为0则输出A,1则是B,2则是Cvoid print

2021-06-05 13:11:47 80

原创 定长顺序表

顺序表1、什么是顺序表:是一种线性结构(1对1的关系),每一个数据元素都有一个前驱(除了第一个元素)和一个后继(除了最后一个元素)在逻辑上数据元素都是连续的,在物理存储上也是连续的。顺序表提供两个内容:1、对数据元素的存储 2、对于顺序表的操作。顺序表在存储元素时,必须连续存储,而且必须从最左边开始存储。定长顺序表:只能存储固定个数的数据元素。2、定长顺序表的实现2.1定长顺序表的声明//以int类型为例,后期可以修改成任意类型typedef int ElemType;#defin

2021-06-05 13:00:49 82

原创 三个数比较大小

三个数比较大小三个数比较大小,即可以输出最大值,也可以输出最小值。输出最大值:int main(){ int max; int a,b,c; printf("请输入三个数:"); scanf("%d %d %d",&a,&b,&c); max=a>b?a:b; max=c>max?c:max; printf("max=%d\n",max); return 0; }输出最小值:int main(){ int min; int a,b,c

2021-03-25 23:00:07 157

原创 希尔排序

希尔排序思想:现将数据分成d个组, 在每个分组内使用直接插入排序算法排序 – 目的就是使得整个数据序列越来越有序。接着将数据继续分组(分组数会越来越小),然后排序, 最后一次分组肯定为1.每个分组数一般是互质的。void Shell(int *arr, int len, int group){ for(int i=group;i<len;++i)//i负责遍历整个数据段, 控制本次直接插入排序处理那一组的数据 { int tmp=arr[i]; int j=i-group; fo

2021-03-12 16:20:58 56

原创 直接插入排序

直接插入排序思想:将数据分成两部分,前一段是已经有序的数据(初始时,前一段数据只有一个),后一段都是无序数据。从无序数据中拿一个数据(左边的第一个数据),插入到前一段的有序数据中,并且使得有序数据段依旧有序。重复上述过程,直到无序数据没有数据。时间复杂度:O(n^2)空间复杂度:O(1)稳定性: 稳定void InsertSort(int *arr, int len){ for(int i=1;i<len-1;++i) { int tmp=arr[i]; int j=i-1;

2021-03-12 16:01:05 61

原创 (选择排序)

选择排序思想:先遍历一遍整个待排序数据,找到当前最大的值的 位置 。将标记的最大值与当前最后一个元素交换。重复上述过程,直到只剩下一个数据。上面的步骤每做一次,下一次就少遍历一个数据(本次找到的最大值)选择排序执行的趟数:数据元素的个数 len - 1。时间复杂度: O(n^2)空间复杂度: O(1)稳定性: 不稳定void SelectSort(int *arr, int len){ int tmp; int maxindex=0;//最大值下标 for(int i=0;i<len

2021-03-12 15:48:22 69

原创 冒泡排序

冒泡排序思路:一趟排序的过程,将相邻的两个元素进行比较,如果前一个比后一个大,则将两个元素交换 ,将最大的元素交换到整个数据的最后。排序的趟数: 数据元素的个数: len - 1。时间复杂度:O(n^2)空间复杂度:O(1)稳定性: 稳定的void BubbleSort(int *arr,int len){ int tmp=0; for(int i=0;i<len-1;i++) { for(int j=0;j<len-1-i;j++) { if(arr[j]

2021-03-12 15:29:24 53

原创 二路归并排序

二路归并排序二路归并排序的思想:一次排序过程,将已经各自有序的两个段的数据合并一个段,并且合并后依旧有序。第一次我们认为单个数据是有序的,一个数据就是一个段,一次排序后,两个数据就是一个有序数据段,这样下一次每个有序数据段就是两个数据。最后将其合并成一个完成有序段,则整个数据就已经排序好了。#include <stdio.h>#include <assert.h>#include <malloc.h>void Meger(int *arr,int len,int

2021-03-12 14:26:25 1204

原创 静态成员函数的特点

静态成员函数特点:子对象与父对象共享了父对象所产生的静态成员。从下面的代码中可以看出子对象和父对象共享了一个num.声明和定义的区别:声明不分配存储空间,而定义需要分配存储空间。#include <iostream>using namespace std;//staticclass Object{private: static int num;//声明 int value;public: Object(int x=0) :value(x) {cout<<"Ob

2021-03-10 15:08:12 409

原创 顺序查找

标题 利用顺序查找,在无序的数组arr中,查找key,找到返回下标,失败返回-1.#include<stdio.h>int Search(int *arr,int len,int key){ int i; for(i=0;i<len;i++) { if(arr[i]==key) { return i; } } return -1;}int main(){ int arr[]={1,2,3,4,5,6,7,12,13,15,44,42,50};

2020-10-27 23:53:26 146

原创 字符串反转

标题 字符串反转方法一:不用计算字符串的长度#include <stdio.h>#include <assert.h>#include <string.h>char *Fun(char *str){ assert(str!=NULL); //断言,即判断字符串不为空 if(str==NULL) return str; int tmp=0; for(int i=0,j=strlen(str)-1;i<j;i++,j--) { tmp

2020-10-27 23:28:10 95

原创 关于交换函数Swap的常见错误和用法

标题关于交换函数Swap的常见错误和用法关于野指针:也称为悬挂指针,你没有访问权限的地址(指针),这个指针有可能不存在也有可能存在但是你不能访问野指针很麻烦,不好判断1.地址不存在2.地址存在但是不能访问3.地址之前可以访问,但现在不可以结论:一个函数(父函数)调用另一个函数(子函数),想通过子函数修改父函数的数据.必须传指针,子函数内部解引用。换句话说,子函数的改变要想影响父函数的数据必须传指针和解引用.。常见错误一·:定义一个整形指针来存放p1,然后交换p1与p2的值,再将tmp的值赋给p

2020-10-13 23:18:08 2284

原创 给出一个n位数的正整数,

要求:(1)求出它是几位数;(2)分别输出每一位数字;(3)按逆序输出各位数字,例如原数为321,应输出123.#include<stdio.h>#include <math.h>#include <string.h>//统计十进制整数为几位数字int GetFigures(long long n){ if(n == 0) return 1; int count = 0;//计算器计算位数 while(n != 0) { n /= 10;//

2020-10-11 22:42:07 485

空空如也

空空如也

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

TA关注的人

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