Data Structures & Algorithms
数据结构与算法 刷题
H.T.Yuan
这个作者很懒,什么都没留下…
展开
-
浙江大学《数据结构》课程小结
浙江大学《数据结构》小结原创 2021-12-05 21:41:32 · 655 阅读 · 0 评论 -
KMP 串的模式匹配 (25 分)
KMP算法(有限状态机思路):https://zhuanlan.zhihu.com/p/83334559//KMP 串的模式匹配#include <iostream>#include <string.h>using namespace std;// BF算法int search(string pat, string txt) { int M = pat.length(); int N = txt.length(); for (int i = 0原创 2021-11-29 23:14:19 · 289 阅读 · 0 评论 -
PTA 04-树4 是否同一棵二叉搜索树
给出一种不建树版本不过不知道为何过不了测试点1:最大N,多组合还请各位帮忙解答一下。题目:结果:#include <iostream>#include <vector>using namespace std;// 对于输入的各种插入序列 确定是否可生成一样的二叉搜索树// 有三种方法// 1.分别建两棵树判别// 2.不建树判别// 3.建一棵树 判别其他序列是否与该树一致// 本方案选择不建树 嘿嘿vector<int> ReadIn(原创 2021-10-10 14:50:55 · 145 阅读 · 0 评论 -
算数运算溢出判断代码
以下代码未溢出返回true 反之false原创 2021-06-17 23:53:17 · 911 阅读 · 0 评论 -
【习题】快速求幂
原理介绍:a^n需要作n-1次乘法运算,我们可不可以考虑使用已知结果,简化计算量呢?答案是显然的,当n是偶数时,我们只需要a^(n/2) * a^(n/2) ,这样就降低了一半的运算量,当n是奇数时,n-1是偶数哇,a^(n-1/2) * a^(n-1/2)*a,也是可以降低约一半的运算量的。1.递归写法:int pow(int a, int n){ if(n == 0) return 1; if(n == 1) return a; if(原创 2021-03-22 10:02:12 · 77 阅读 · 0 评论 -
【习题】关于素数
1.判断数N是否是素数素数即质数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。反之则为合数。1既不是素数也不是合数。那么根据定义,即可判断一个整数n是否为素数:bool isPrime(int n){ //判断n是否是素数 if(n == 1) return false; //2~n-1中只要有因数就不是素数 for(int i = 2;i < n;i++) if(n % i==0) retu原创 2021-03-22 00:07:21 · 476 阅读 · 0 评论 -
求子序列和/乘积 最值
最近在学习《数据结构与算法分析》C语言时,第二章内容中出现了几个比较新颖的算法,这里记录一下。1.a.求最小子序列和://思路是,逐步计算,如果ThisSum 是正数,//则ThisSum对于后面的数而言是累赘,舍去int MinSubsequenceSum(vector<int>& V){ int length = V.size(); int MinSum = V[0]; int ThisSum = 0; for(int i = 0; i &原创 2021-03-21 23:45:36 · 284 阅读 · 0 评论 -
剑指 Offer 38. 字符串的排列
输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。本题没有做出来,先把答案记录一下输入:s = "abc"输出:["abc","acb","bac","bca","cab","cba"]class Solution {public: vector<string> permutation(string s) { dfs(s, 0); return res; }private:原创 2021-03-09 19:17:13 · 76 阅读 · 0 评论 -
【剑指Offer】面试题8 寻找二叉树中序遍历的下一个节点
struct TreeNode{ int value; TreeNode* left; TreeNode* right; TreeNode* parent;};//首先分为三种情况,由于是中序遍历,当执行到节点时,如果该节点存在右子树 则下一个节点就是右子树的最左节点;//如果没有右子树,则细分有三种情况://1.该节点是其父节点的左子节点,则遍历输出的下一个节点就是父节点//2.该节点是其父节点的右子节点,则遍历输出的下一个节点应当往上追溯至节点为其父节点的左子原创 2021-02-22 13:05:40 · 99 阅读 · 0 评论 -
【剑指Offer】面试题6从尾到头打印链表
输入头节点,从尾到头打印链表:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: vector<int> reversePrint(ListNode* head) {原创 2021-02-20 00:01:31 · 34 阅读 · 0 评论 -
【剑指Offer】面试题5 替换空格
题目:代码:c++ STL 方法 时间复杂度高class Solution {public: string replaceSpace(string s) { int pos = s.find(' '); while(pos != -1) { s.erase(pos,1); s.insert(pos,"%20"); pos = s.find(' '); }原创 2021-02-18 22:19:44 · 54 阅读 · 0 评论 -
【剑指Offer】面试题4 二维数组中的查找
题目:结题代码:class Solution {public: bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) { if( matrix.size() > 0) { int rows = matrix.size(); int columns = matrix[0].size();原创 2021-02-18 13:32:15 · 67 阅读 · 0 评论 -
【剑指Offer】面试题3 数组中重复的数字
题目1描述:找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入: [2, 3, 1, 0, 2, 5, 3]输出:2 或 3代码实现:class Solution {public: int findRepeatNumber(vector<int>& nums) { for(int原创 2021-02-17 23:22:51 · 69 阅读 · 0 评论 -
《算法图解》所述算法Python实现
BFS 广度优先搜索BFS 指出是否有A到B的路径,如果有 找出最短路径下述代码在关系图中,找到最亲近的经销商from collections import dequedef search(name): search_person = deque() search_person += graph[name] popdone = [] while search_person: person = search_person.popleft() .原创 2021-02-14 20:36:24 · 336 阅读 · 0 评论 -
【剑指Offer】面试题2 实现Singleton(单例)模式
考点:单例模式的理解基础语法:构造函数 和静态成员变量的理解多线程编程#include<iostream>using namespace std;//剑指offer 面试题2 实现Singleton模式//设计一个类,只能生成该类的一个实例class Singleton{private: Singleton(){}; //声明静态构造函数 static Singleton* instance; public: static S.原创 2021-01-26 14:00:30 · 79 阅读 · 0 评论 -
【剑指offer】面试题1 赋值运算符函数
#include<cstdio>#include <cstring>//剑指offer 面试题1 赋值运算符函数//如下为类型CMyString的声明,为该类型添加赋值运算符函数class CMyString{public: CMyString(char* pData = nullptr); CMyString(const CMyString& str); CMyString& operator = (const CMyString原创 2021-01-24 23:08:04 · 92 阅读 · 0 评论 -
欧几里得算法详解
一、干什么用?算出最大两个非负整数的最大公约数。虽然小学知识,大家概念很清楚,但我们这里还是提下,能被两个数A,B整除的最大整数C,就称C是A和B的最大公约数。可以用GCD(A,B)表示。GCD是Greatest Common Divisor的缩写。二、欧几里得算法的内容欧几里得是快速找出两个数最大公约的一种算法。算法核心思想:例如找A,B的最大公约数GCD(A,B),并且A>B如果A=0,那么GCD(A,B)=GCD(0,B)=B;如果B=0,那么DCD(A,B)=GCD(A,0)=A;转载 2021-01-24 14:16:52 · 4188 阅读 · 0 评论 -
求链表中的倒数第k个节点
求链表中的倒数第k个节点是数据结构中的经典面试题,思路是用两个指针,第一个指针先走k-1步,然后两个指针一起走。当第一个指针走到尾节点时,第二个指针指向的就是倒数第k个节点。 本文基于C++对这一思想做具体实现,且基于数学知识,附上算法的详细解释与说明。原创 2021-01-24 00:34:27 · 178 阅读 · 0 评论