数据结构与算法
数据结构 算法
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 · 250 阅读 · 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 · 396 阅读 · 0 评论 -
插入排序
#include <QCoreApplication>#include <iostream>using namespace std;/*插入排序,默认从小到大1、元素拿出来,形成空位2、满足条件的元素后移*/void InsertionSort(int in[], int len)//O(n*n){ int i = 0; int j = 0; int k = 0;//存放插入点的位置 int temp;//存放拿出来的数 /.原创 2020-12-18 14:22:34 · 90 阅读 · 0 评论 -
冒泡排序
#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 · 138 阅读 · 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 · 1100 阅读 · 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 · 1198 阅读 · 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 · 219 阅读 · 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 · 98 阅读 · 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 · 132 阅读 · 0 评论 -
回文
//思路://1、计算出需要比较的次数//第一次比较,看第一个字符与最后一个字符是不相等的,如果是的话就继续下一个字符的比较//进行第二次的比较,看第二个字符是否与倒数第二个字符相等//如果在上面的比较中有一个字符是不相等的话,那么字符串不是回文了。bool IsLevel(char* pStr){ if(pStr == NULL){ return false; } bool found = true;//默认是TRUE int iLen = st.原创 2020-12-17 14:52:50 · 112 阅读 · 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 · 160 阅读 · 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 · 237 阅读 · 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 · 162 阅读 · 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 · 99 阅读 · 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 · 146 阅读 · 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 · 212 阅读 · 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 · 130 阅读 · 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 · 119 阅读 · 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 · 307 阅读 · 0 评论 -
用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回 -1 )class CQueue {public://只用一个栈当做队列,另一个stack2 用来辅助 stack<int> stack1; stack<int> stack2; CQueue() { } //队尾加入元素.原创 2020-07-15 22:04:59 · 161 阅读 · 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 · 114 阅读 · 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 · 145 阅读 · 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 · 152 阅读 · 0 评论 -
滑动窗口的最大值
给定一个数组nums和滑动窗口的大小k,请找出所有滑动窗口里的最大值。思路:维护一个单调双端队列queIndex,始终保持队列的头部元素最大。双端队列中存放当前窗口对应的递减值索引,保证最大值永远在头部位置,索引值在窗口的可视范围,具体步骤:1、循环数组,如果数组的某值比queIndex中对应的值小,则直接加入队列,反之遍历队列删除比该值小的索引,之后再加入2、保证队列中索引不超出窗口范围,否则从队头删除3、记录窗口最大值class Solution {public: ...原创 2020-07-05 15:48:21 · 209 阅读 · 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 · 132 阅读 · 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 · 138 阅读 · 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 · 147 阅读 · 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 · 166 阅读 · 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 · 245 阅读 · 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 · 300 阅读 · 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 · 222 阅读 · 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 · 520 阅读 · 0 评论 -
从上往下打印二叉树
实现功能:从上往下打印出二叉树的每个节点。要求:1、从上至下按层打印2、同层节点从左至右打印按层打印又称为二叉树的广度优先搜索(BFS),BFS通常借助队列的先入先出特性来实现。广度优先搜索(Breadth First Search),又叫宽度优先搜索或横向优先搜索,是从根结点开始沿着树的宽度搜索遍历。上面二叉树的遍历顺序为:ABCDEFG。/** * Definition for a binary tree node. * struct TreeNode { * int .原创 2020-06-24 09:53:41 · 156 阅读 · 0 评论 -
图解:二叉搜索树算法(BST)
树是由节点和边构成,储存元素的集合。节点分根节点、父节点和子节点的概念。如图:树深=4;5是根节点;同样8与3的关系是父子节点关系。二叉树binary tree,则加了“二叉”(binary),意思是在树中作区分。每个节点至多有两个子(child),left child & right child。二叉树在很多例子中使用,比如二叉树表示算术表达式。如图:1/8是左节点;2/3是右节点;二、二叉搜索树 BST顾名思义,二叉树上又加了个搜索的限制。其要求:每个节点比其左子树元素大,比..转载 2020-06-09 09:25:38 · 982 阅读 · 0 评论 -
堆
定义:【最大树(最小树)】每个节点的值都大于(小于)或等于其子节点(如果有的话)值的树。最大树与最小树的例子如下所示,虽然这些树都是二叉树,但最大树不必须是二叉树,最大树或最小树节点的子节点个数可以大于等于2. ...原创 2019-02-16 10:14:25 · 379 阅读 · 0 评论 -
二叉树特性回顾
原创 2019-02-16 09:15:41 · 206 阅读 · 0 评论 -
二叉树的三种遍历
二叉树遍历分为三种:前序、中序、后序,其中序遍历最为重要,若给定中序遍历,再加上前序或者后续遍历其中一个就能唯一确定一颗二叉树。 A:根节点、B:左节点、C:右节点二叉树遍历:根据根节点的排列顺序可分前中后,因此就有前序遍历,中序遍历和后续遍历如下二叉树,我们来看其...原创 2019-02-08 08:48:25 · 285 阅读 · 0 评论