![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c/c++
c/c++
Cindy_1224
这个作者很懒,什么都没留下…
展开
-
在相邻的不相同的字符后面插入字符的个数
#include <QCoreApplication>//在不同字符后面插入字符的个数char* transformation(char* str){ if(str == NULL) return NULL; int len = strlen(str); char* buf = new char[len + 1]; char* p = str; char* q = p + 1; int count = 1; while(*q != .原创 2020-12-22 12:55:37 · 230 阅读 · 0 评论 -
loopmove
#include <QCoreApplication>//移动后面n个字节到前面,前面字符串后移。比如"123456", n = 3,//运行结果456123char* loopmove(char* str, int n){ if(str == NULL) return NULL; char* head = str; char* head2 = str; char* buf = (char *)malloc(n); int strLen = st.原创 2020-12-22 12:42:29 · 366 阅读 · 0 评论 -
选择排序
#include <QCoreApplication>#include <iostream>using namespace std;//选择排序,大循环每次选择一个数与后面元素逐个比较void mysort(char* src,int len){ int tem =0; int exchanged = 1;//交换标志位 for(int i = 0; i < len && exchanged; i++){ //每轮.原创 2020-12-18 17:25:57 · 99 阅读 · 2 评论 -
冒泡排序
#include <QCoreApplication>#include <iostream>using namespace std;//从小到大void bubbleSort(int*in , int len) {//O(n*n) int i,j,t; int exchanged = 1;//交换标志位 //i 是比较的轮次,如果上一轮发生了交换则启动下一轮,否者无需交换 for (i = 0; (i < len) &&am.原创 2020-12-18 14:15:44 · 122 阅读 · 0 评论 -
int2str
#include <QCoreApplication>#include <iostream>using namespace std;//将整数转换成字符串,比如-1234//转换成-1234的字符串void int2str(int n, char* pStr){ if(pStr == nullptr) return; char buf[20] = {'\0'}; int i = 0, len = 0; int t = n > 0 ?.原创 2020-12-17 15:39:11 · 1045 阅读 · 0 评论 -
str2int
#include <QCoreApplication>int str2int(char *pStr, int* i){ if(pStr == nullptr) return 0; bool flag = false; char* pTem = pStr; int temp = 0; if(*pStr == '+' || *pStr == '-'){ pTem++; } //遍历字符串 while(pTem !=.原创 2020-12-17 15:16:20 · 1152 阅读 · 0 评论 -
revStr
#include <QCoreApplication>#include <iostream>using namespace std;void swap_(char* pstr, char* end){ char t; t = *pstr; *pstr = *end; *end = t; return;}void swap(char& a, char& b){ a = a + b; b .原创 2020-12-17 15:10:58 · 193 阅读 · 0 评论 -
strcpy 和memcpy
#include <QCoreApplication>#include <assert.h>char* strCpy(char* dest, const char* src ){ if(dest == NULL || src == NULL) return NULL; char* start = dest; char* pt= dest; while( (*pt++ = *src++) != '\0'); return s.原创 2020-12-17 15:03:08 · 78 阅读 · 0 评论 -
strcmp
//将两个字符串都进行比较一遍,当发现他们存在不同的值时停止循环,根据最后//一个字符的大小返回相应的结果int myStrcmp(const char* src, const char* dst){ int ret = 0; while( *dst != '\0'){ ret = *src - *dst; if(ret != 0) {//第一个不相等的数就决定了字符串的大小了 break; } .原创 2020-12-17 14:58:58 · 85 阅读 · 0 评论 -
回文
//思路://1、计算出需要比较的次数//第一次比较,看第一个字符与最后一个字符是不相等的,如果是的话就继续下一个字符的比较//进行第二次的比较,看第二个字符是否与倒数第二个字符相等//如果在上面的比较中有一个字符是不相等的话,那么字符串不是回文了。bool IsLevel(char* pStr){ if(pStr == NULL){ return false; } bool found = true;//默认是TRUE int iLen = st.原创 2020-12-17 14:52:50 · 92 阅读 · 0 评论 -
两个字符串的最大公共子窜
const char* maxCommonString(char* str1, char* str2){ //判断非空性 if(str1 == NULL || str2 == NULL){ return NULL; } //计算两个字符串的大小,区分长短窜 int iLen1 = strlen(str1); int iLen2 = strlen(str2); int iSmallLen = iLen1 > iLen2 ? iL.原创 2020-12-17 14:46:01 · 118 阅读 · 0 评论 -
strStr
查看 一个字符窜中是否包含一个子字符串。返回主窜中子窜开始的位置。const char* strStr(const char* src, const char* sub){ if (src == NULL || sub == NULL) return NULL; const char*psub = sub; const char* pSrc = src; while(*src != '\0'){//pSrc 主循环一位一位的移动,不用*src++,原创 2020-12-17 14:41:49 · 212 阅读 · 0 评论 -
建造者模式
如果一个对象的构建比较复杂,将一个对象的构建和对象的表示进行分离,使得同样的构建过程可以创建不同的表示,那么比较适合采用建造者模式。builer: 为创建产品的各个部分,统一抽象接口Abuilder:具体的建造着类,创建该产品的各个部分,部分A、部分B、部分Cdirector:构造一个使用builer接口的对象product:表示被构造的复杂对象一个对象的构建比较复杂,将一个对象的构建和对象的表示进行分离,使得同样的构建过程可以创建不同的表示#include <QCoreAp..原创 2020-12-15 12:53:32 · 103 阅读 · 0 评论 -
工厂模式
工厂模式的定义:定义一个(创建对象的接口),让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。工厂模式中,产品抽象类Iproduct负责定义产品的共性,实现对产品的抽象定义;工厂抽象类IFactory负责抽象创建产品,也就是抽象工厂,具体如何创建产品由具体的实现工厂类比如AFactory来完成。以上通用模式用的比较多。该模式的特点是封装性良好,可扩展性好,屏蔽了产品类,是典型的解耦框架。使用场景:1、需要灵活可扩展的框架时,可以考虑。2、在测试驱动开发的框架下。工程模式说白了原创 2020-12-14 21:54:51 · 81 阅读 · 0 评论 -
代理模式
#include <QCoreApplication>#include <iostream>using namespace std;class ISellingbooks{ public: virtual void DoSeling() = 0;};//代理卖书实现虚基类卖书class ProxySeling:public ISellingbooks{ public: void DoSeling(){ cout<<...原创 2020-12-11 21:16:06 · 113 阅读 · 0 评论 -
适配器模式
适配模式让我想起到了电脑的适配器, 设配器的功能就是将输入220A/5A的输入电源进行转化,成为适应电脑的输入电源18V /1A,适配器模式就是这个转换过程。如上图在USB接口中接入电源插座B的接口,使之能适应于USB插座,而不改变usb原有的接口,在usb系统中新增adapter类,该类对外接口与usb接口保持一致。在adapter 中封装了SocketOutput 接口,通关adapter改变电源和电流(变压),使之变得合适USB。//插座抽象类class ISocketOut...原创 2020-12-11 16:51:59 · 165 阅读 · 0 评论 -
迭代器模式
迭代器的核心实现是:让容器对应的具体迭代器类中拥有该容器的引用成员变量。在创建迭代器时把容器对象的引用传给迭代器,那么迭代器就可以操作容器元素了。Iterator的核心功能,就是提供了一种特定的方法,顺序访问一个容器中的各个元素,既不会暴露容器的内部设计细节(容器底层数据结构),又可以让外部代码透明的访问集合内部的所有元素。#include <QCoreApplication>#include <iostream>typedef int Object;#defi.原创 2020-12-11 12:34:45 · 123 阅读 · 0 评论 -
c++编译器对类的内部处理
class test{public: int i; //普通成员变量,存储于对象中,与struct 变量有相同的内存布局和字节对齐方 static int d; //不在对象中占用内存,该数据分配在全局数据中 void setfun(int i) {//存在代码段中 this->i = i; } int getfun() { //存在代码段中 return i; } static void print() {//存在代码段中 printf("th..原创 2020-12-05 11:32:21 · 562 阅读 · 1 评论 -
FFmpeg 中的时间戳
在弄明白音视频的同步过程中,有关于时间戳的问题一直很费解,ffmpeg结构体多,在多个结构体中存在time_base字段,在看代码时总是一头雾水,搞清楚各个time_base的来源和作用,对于阅读ffmpeg的代码很重要。time_base在FFmpeg中,时间基(time_base)是时间戳(timestamp)的单位,时间戳值乘以时间基,可以得到实际的时刻值(以秒等为单位)。例如,如果一个视频帧的dts是40,pts是160,其time_base是1/1000秒,那么可以计算出此视频帧的解码时.转载 2020-08-19 15:42:36 · 1462 阅读 · 0 评论 -
SDL条件变量,锁机制
最近看FFmpeg 源码,其中有用到SDL,在这学习一下。SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。总之SDL是一款跨平台的多媒体开源库,用处很多。 ...原创 2020-08-18 18:04:02 · 1539 阅读 · 0 评论 -
连续子数组的最大和
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。示例1:输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释:连续子数组[4,-1,2,1] 的和最大,为6。思路:动态规划,维持最大的和maxSumclass Solution {public: int maxSubArray(vector<int>& nums) { ...原创 2020-07-18 13:11:09 · 83 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。示例:输入:nums =[1,2,3,4]输出:[1,3,2,4] 注:[3,1,2,4] 也是正确的答案之一。思路:数组首尾采用双指针l r,在l < r 的条件下循环数组;当左边数组nums[l] & 1 == 1 时,是奇数,执行l++ ,否则是偶数,跳出本轮循环,执行数组交换;当右边数组nums[r]&1 == 0时,是偶数,执..原创 2020-07-18 12:15:26 · 128 阅读 · 0 评论 -
二进制中1的个数
请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。示例 1:输入:00000000000000000000000000001011输出:3解释:输入的二进制串 00000000000000000000000000001011中,共有三位为 '1'。思路:巧用n&(n -1),(n−1) 解析: 二进制数字 n最右边的 1 变成 0 ,此 1 右边的 0 都变...转载 2020-07-18 11:09:16 · 188 阅读 · 0 评论 -
旋转数组的最小数字
把一个数组最原始的若干元素搬到数组的末尾,我们称之为数组的旋转,该数组称为旋转数组。题目诉求:输入一个递增排序数组的一个旋转,输出该旋转数组的最小值。例如,数组[3,4,5,1,2]为[1,2,3,4,5]的一个旋转,该数组的最小值为1。示例 1:输入:[3,4,5,1,2]输出:1思路:首先数组是一个排序好的递增数组,最小值是数组的第一个元素,只是旋转之后原本最小值在数组中的位置就不确定了,问题就是要找到这个旋转点在哪里。采用循环二分查找,复杂度可降低至对数级。1、令...原创 2020-07-18 09:57:16 · 108 阅读 · 0 评论 -
青蛙跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:青蛙跳上一个n级台阶的跳法有两种:第一种,从n - 1级台阶上跳一步(1级台阶)到n级台阶;第二种,从n - 2级台阶跳2级台阶(两步)到n级台阶。f(n) = f(n -1) + f(n - 2) 问题转化为求斐波那契数列的第n项。用动态规划来做。class Solution {public: int numWays(int n) { int a = 1, ...原创 2020-07-17 21:29:58 · 99 阅读 · 0 评论 -
斐波那契数列
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:F(0) = 0,F(1)= 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.思路:动态规划法,由于该数列的任意i项只与第i - 1项和第i - 2项有关,因此只要初始化两个整形变量,利用辅助变量使两整形变量交替前进即可。class Solution {public: int fib(int n) { inta = 0; ...原创 2020-07-17 20:46:38 · 268 阅读 · 0 评论 -
用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回 -1 )class CQueue {public://只用一个栈当做队列,另一个stack2 用来辅助 stack<int> stack1; stack<int> stack2; CQueue() { } //队尾加入元素.原创 2020-07-15 22:04:59 · 144 阅读 · 0 评论 -
从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]思路:递归到链表最后一个节点,从尾往前打印。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * };原创 2020-07-15 21:40:30 · 97 阅读 · 0 评论 -
替换空格
实现一个函数,把字符串s中的每个空格替换成"%20"。示例 1:输入:s = "We are happy."输出:"We%20are%20happy."思路:1、将空格换成"%20"意味着每换一个空格就需要多出2个空间来,先根据空格数量在字符串末尾扩容两个字符空间。2、比较扩容后S的长度,相等的话说明没有空格不要替换,直接返回s。3、倒叙遍历将原来位置的字符(到没扩容之前的长度为止)放到后面, 最后返回s。class Solution {public: strin..原创 2020-07-15 21:30:58 · 127 阅读 · 0 评论 -
数组中重复的数字
找出数组中重复的数字。在一个长度为n的数组nums里的所有数字都在0~n-1的范围内。数组中的某些数字是重复的,但不知道有几个数字是重复了,也不知道每个数字重复了几次。请找出数字任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3 思路:1、创建长度为nums.size()的bool类型数组flag[nums.size()],数组每个元素都初始化为FALSE。2、遍历nums,如果nums[i]对应的flag为FALSE,则说明目前为止是第一原创 2020-07-15 21:07:23 · 136 阅读 · 0 评论 -
剑指offer 面试分类总结
数组:面试题3:数组中重复的数字 面试题4:二维数组中的查找 面试题21:调整数组顺序使奇数位于偶数前面 面试题39:数组中出现次数超过一半的数字 面试题42:连续子数组的最大和 面试题45:把数组排成最小的数 面试题49:丑数 面试题50:第一个只出现一次的字符 面试题51:数组中的逆序对 面试题56:数组中数字出现的个数 面试题57:和为s的数字 面试题59:队列的最大值 面试题61:扑克牌中的顺子 面试题63:股票的最大利润字符串:面试题5:替换空格 面试题17:原创 2020-07-15 19:55:53 · 144 阅读 · 0 评论 -
滑动窗口的最大值
给定一个数组nums和滑动窗口的大小k,请找出所有滑动窗口里的最大值。思路:维护一个单调双端队列queIndex,始终保持队列的头部元素最大。双端队列中存放当前窗口对应的递减值索引,保证最大值永远在头部位置,索引值在窗口的可视范围,具体步骤:1、循环数组,如果数组的某值比queIndex中对应的值小,则直接加入队列,反之遍历队列删除比该值小的索引,之后再加入2、保证队列中索引不超出窗口范围,否则从队头删除3、记录窗口最大值class Solution {public: ...原创 2020-07-05 15:48:21 · 190 阅读 · 1 评论 -
两个链表的第一个公共节点
输入两个链表,找出它们的第一个公共节点。如下面的两个链表:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode *getIntersectionNode(Li原创 2020-06-27 17:00:46 · 116 阅读 · 0 评论 -
数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。.原创 2020-06-27 15:24:42 · 119 阅读 · 0 评论 -
和为s的连续正数序列 II
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1:输入:target = 9输出:[[2,3,4],[4,5]]示例 2:输入:target = 15输出:[[1,2,3,4,5],[4,5,6],[7,8]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-原创 2020-06-27 09:56:03 · 132 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。class Solution {public: bool verifyPostorder(vector<int>& postorder) { return recur(postorder, 0, postorder.size()-1); } bool recur(vector<..原创 2020-06-25 17:06:03 · 148 阅读 · 0 评论 -
. 二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树:root =[6,2,8,0,4,7,9,null,null,3,5]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-z...原创 2020-06-25 13:14:18 · 222 阅读 · 0 评论 -
二叉树的最近公共祖先 II
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树:root =[3,5,1,6,2,0,8,null,null,7,4]说明:所有节点的值都是唯一的。 p、q 为不同节点且均存在于给定的二叉树中。题目来源:https://leetcode-cn.com/prob...原创 2020-06-25 12:52:44 · 246 阅读 · 0 评论 -
从上到下打印二叉树 III
实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NU原创 2020-06-24 14:58:28 · 198 阅读 · 0 评论 -
从上到下打印二叉树 ——按行打印
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。例如:给定二叉树:[3,9,20,null,null,15,7],/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NU.原创 2020-06-24 11:43:47 · 457 阅读 · 0 评论