![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
没有撤退可言~
花有重开日,人无再少年
展开
-
把字符串中的空格替换成三个字符,斐波拉契数列巧妙算法,输入一个链表,按链表从尾到头的顺序返回一个ArrayList,反转单链表,字符串转数字
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如:当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路:从前向后记录‘ ’数目,从后向前替换‘ ’。 重点:从后向前替换的时候的技巧1.首先计算出有多少个空格2.我们是从后向前查找空格的,在没有查找到空格,之前应该将遍历到的数字,全部按照按规律后移假如说存在两个空格coount =...原创 2019-09-27 21:52:46 · 154 阅读 · 0 评论 -
双栈实现队列;输入一个整数,判断二进制形式有多少个1,其中负数以补码运算;统计一个数字在排序数组中出现的次数。
双栈实现队列:class Solution{public: void push(int node) { if(!stack2.empty()) { while(!stack2.empty()) { stack1.push(stack2.top()); ...原创 2019-09-29 11:27:32 · 105 阅读 · 0 评论 -
转圈打印矩阵;一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字;
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.class Solution {public: vector<int> printMatrix(vecto...原创 2019-09-29 21:38:05 · 171 阅读 · 0 评论 -
反转单词序列;不使用判断和循环求和;链表是否带环
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student.a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?class Solution {...原创 2019-10-10 17:37:47 · 94 阅读 · 0 评论 -
双向链表的基本操作;移除链表相同的元素;链表的中间结点;链表合并
#include<iostream>#include<assert.h>using namespace std;//双向带头循环链表typedef struct Node{ int value; struct Node* next; struct Node* before;}Node;typedef struct List{ Node* fi...原创 2019-10-12 17:51:50 · 151 阅读 · 0 评论 -
有序链表中重复数字的全部删除;交叉链表求交点;合并有序链表;
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5首先要想到所有的情况,然后再开始ListNode* deleteDuplication(ListNode* pHead){ if (pHead == nullptr)...原创 2019-10-14 16:04:07 · 215 阅读 · 0 评论 -
设计循环队列;相同的二叉树(左右子树顺序也要相等);对称二叉树;字符串的全排列;另一个树的子树;
设计循环队列需要说明的几点是1.再不循环的队列中,插入元素是下标是[rear++]2.在循环队列中,插入元素的下标是[(read + 1) % capacity];capacity指的就是创建队列是的大小3.在不循环队列中取队尾元素是[rear - 1]4.在循环队列中取队尾元素是[(rear + capacity - 1) % capacity]class MyCircularQue...原创 2019-10-15 18:09:28 · 196 阅读 · 0 评论 -
二叉树的构建;求叶子节点个数;最小栈的三种解法;判断一棵树是完全二叉树;二叉树的前序,后续,中序遍历,不使用递归实现;
二叉树的构建二叉树如果是以 1 2 3 4 5 6 7 8 9 这种形式给出的话那么只是一个前序 后续,或者中序遍历是无法拿到准确的树形结构的,但是当给出标志位之后,例如1 2 4 6 # # # 5 # # 3 # #之后便可以通过一个遍历还原出树形结构,首先先讲一下,通过标志位来构建树问题:编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如...原创 2019-10-16 18:10:29 · 296 阅读 · 0 评论 -
判断二叉树是不是平衡二叉树;将二叉树转换为字符串形式;二叉树的公共祖先;
判断树是不是平衡二叉树;class Solution {public: int Length_Tree(TreeNode* tree) //判断左右树的深度 { if(tree == nullptr) return 0; int left = Length_Tree(tree->left); ...原创 2019-10-17 15:48:57 · 114 阅读 · 0 评论 -
在二维数组中查找某一个数字;如何获取二叉树从根到当前节点的路径;二叉搜索树;前序遍历+中序遍历还原二叉树;
在二维数组中查找某一个数字;思想从这两个脚中的某一个脚开始查找,总之原则就是,当前所在元素的上面和另一个位置,两个位置的元素必须一个大于一个小与当前元素,不然无法选择走那一条路class Solution{public: bool Find(int target, vector<vector<int> > array) { // array是二维数组...原创 2019-10-22 10:28:15 · 361 阅读 · 0 评论 -
牛牛问题,字符串查重问题
因为题目要求是输入两行,所以只能那字符串来接收,再逐个字符转换#include<iostream>#include<string>#include<vector>#include<algorithm>using namespace std;int main(){ string i; //接受第一行数字的字符串 string ...原创 2019-11-06 19:04:18 · 156 阅读 · 0 评论 -
牛牛问题,字符串问题
#include <iostream>#include <vector>using namespace std;int main(){ int n; int i = 0; while (cin >> n) { vector<int> a; //申请空间的时候多申请一个空间来存放0,放置到之后发生越界 a.resize(n...原创 2019-11-08 10:14:28 · 266 阅读 · 0 评论 -
连续字符串最长问题,输出数组中超过一半的数字
#include<iostream>#include<string>using namespace std;int main(){ string s1; string s2; while(getline(cin,s1)) { for(size_t i = 0;i<s1.size();++i) {...原创 2019-11-08 20:24:37 · 863 阅读 · 0 评论 -
花花问题,最大子序列问题
//暴力破解#include<iostream>#include<string>#include<algorithm>using namespace std;int main(){ string s1; string s2; getline(cin, s1); getline(cin, s2); string s3 = s1; stri...原创 2019-11-10 20:13:12 · 118 阅读 · 0 评论 -
字符串转数字
class Solution {public: int StrToInt(string str) { int n = str.size(); if (n == 0) return 0; int flag = 0; int count = 0; if ('0' <= str[0] && str[0] <= '9') { for (int i...原创 2019-11-12 08:49:28 · 69 阅读 · 0 评论 -
单字节元素的最大连续的1;满二叉树的两个节点的最近祖先
单字节所有的元素都是正数。唯一要注意的一点就是需要循环起来,不循环起来,测试不能通过。#include<iostream>using namespace std;int main(){ int d; while(cin >>d) { int flag1 = 0; int count = 0; int max = c...原创 2019-11-18 19:54:23 · 81 阅读 · 0 评论 -
大家一起来做题
这道题感觉主要想考察的就是负数的处理,比起while循环我感觉还是for循环更好用#include<iostream>using namespace std;int main(){ int c; int count = 0; while (cin >> c) { for (int i = 0; i < 31;++i) //一个for循环搞定 ...原创 2019-11-22 13:23:55 · 72 阅读 · 0 评论 -
杨辉三角变形,大数相加(正整数)
#include<iostream>using namespace std;int main(){ int c; while (cin >> c) { if (c == 1 || c == 2) // 特殊情况 { cout << -1 << endl; continue; } if(c % 2 == 1...原创 2019-11-24 20:21:46 · 124 阅读 · 0 评论 -
判断两个字符串的最长公共序列(空间复杂度为1)
#include<iostream>#include<string>using namespace std;int main(){ string str1; string str2; while (cin >> str1 >> str2) { if (str1.size() < str2.size()) swap(s...原创 2019-11-28 22:41:08 · 169 阅读 · 0 评论 -
扑克牌顺子,孤儿院孩子做游戏,中位数,连续正数和
int LastRemaining_Solution(int n, int m){ if (n < 1) return -1; vector<int> vec; vec.resize(n); int count = n; for (int i = 0, j = 0;; ++j) { if (vec[j] != 1) { if (i == m ...原创 2019-12-09 21:57:23 · 110 阅读 · 0 评论 -
简单题
class Solution {public: void reOrderArray(vector<int> &array) { vector<int> vec1; vector<int> vec2; int size = array.size(); for(int i = 0;...原创 2019-12-11 22:25:16 · 68 阅读 · 0 评论 -
简单题,字符串全排列(带重复字符)
层序遍历/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: vector<int> Pri...原创 2019-12-12 22:17:25 · 135 阅读 · 0 评论 -
是否存在子树,判断二叉树是否对称,将二叉树按镜象反转,最大子序列和,1 - n 之间1出现的次数
/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: bool func(TreeNode* pRoot1...原创 2019-12-13 19:26:22 · 130 阅读 · 0 评论 -
sort+ 仿函数
class Solution { public: static bool cmp(int a,int b){ string A=""; string B=""; A+=to_string(a); A+=to_string(b); B+=to_string(b); B+=to_s...原创 2019-12-13 20:13:01 · 961 阅读 · 1 评论 -
判断一个数是不是丑数
#include<iostream>using namespace std;bool func(int num){ int flag = 0; for (int i = 2; i <= sqrt(num); ++i) { if (num% i == 0) { flag = 1; break; } } if (flag == 1) re...原创 2019-12-15 21:09:57 · 243 阅读 · 0 评论 -
青蛙跳台阶,变态版
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。知道规律就好解决class Solution {public: int jumpFloorII(int number) { int i = 1; while(--number) { i *= 2; ...原创 2019-12-31 22:57:05 · 107 阅读 · 0 评论 -
二叉树路径上的和为某一值;第一个只出现一次的字符位置;二叉树的深度;判断一棵树是不是平衡二叉树
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) :...原创 2020-01-01 20:54:28 · 83 阅读 · 0 评论 -
判断一个数组中逆序对的个数;两个链表的第一个公共结点;
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007输入两个链表,找出它们的第一个公共结点。首先相交的链表肯定不会是X形,在两个链表相交之后,两个链表后面的节点都是相等的先拿到两个链表的 长度,然后让较长的链表先走,先走的节点个数就是两个...原创 2020-01-03 00:41:58 · 120 阅读 · 0 评论 -
不使用+ - * /,来进行加法运算;判断一个字符串是不是合法的数字
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。刚开始想到的是利用,数组或者字符串的插入删除操作,来进行求解,但是,考虑了一下,情况太多,一时间,插入删除的情况,数组又存在越界的情况所以有点麻烦,就放弃了,但是要是说写的话,其实也是可以写的,只是比较麻烦。接着是利用++,–,虽然说是不使用±*/,但是++,–不算在里面的,这个算是取巧的写法,不值得参考。clas...原创 2020-01-03 14:04:02 · 441 阅读 · 0 评论 -
二叉树的下一个节点;二叉搜索树中第k小个元素
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。/*struct TreeLinkNode { int val; struct TreeLinkNode *left; struct TreeLinkNode *right; struct TreeLinkNode *next;...原创 2020-01-03 22:31:14 · 103 阅读 · 0 评论 -
序列化二叉树
/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: char...原创 2020-01-06 16:42:05 · 60 阅读 · 0 评论 -
滑动窗口的最大值;重建二叉树
class Solution {public: vector<int> maxInWindows(const vector<int>& num, unsigned int size) { int length = num.size(); vector<int> vec1; for (int i = 0; ...原创 2020-01-06 17:12:07 · 114 阅读 · 0 评论 -
二叉搜索树的后续遍历序列;之字形打印二叉树
解题思路:这道题第一次没有思路,有了思路之后很简单就是,后序遍历最后一个元素就是根节点,然后重新遍历整个序列这个序列,一旦遇到了大于跟结点的数字,那么就不可能再遇到小于根节点的数字了,一旦遇到了,就说明这个序列不是合格的二叉搜索树的后续遍历序列class Solution {public: bool VerifySquenceOfBST(vector<int>...原创 2020-01-06 21:15:19 · 91 阅读 · 0 评论 -
平衡二叉树转为排序的双向链表;知道孩子如何求双亲
//平衡二叉树转为排序的双向链表void func(T*& tree,T* prev = nullptr) //这里传的相当于是二级指针,因为内部的修改将会影响外部根指针的结构{ if (tree == nullptr) return; func(tree->left); tree->left = prev; if (prev) prev->right...原创 2020-01-12 10:30:29 · 208 阅读 · 0 评论 -
0-1背包问题
主要是这里的递归公式,用括号括起来的就是#include<iostream>#include<vector>using namespace std;int B[6][21] = { 0 };int W[6] = { 0, 2, 3, 4, 5, 9 };int V[6] = { 0, 3, 4, 5, 8, 10 };void func(){ for...原创 2020-03-21 00:44:08 · 107 阅读 · 0 评论 -
计算一个数字二进制位有多少个1
#include<iostream>#include<string>#include<vector>using namespace std;int main(){ int a; cin>>a; int count = 0; while(a) { if(a & 1 == 1)...原创 2020-06-23 16:41:19 · 221 阅读 · 0 评论 -
动归 --- 1
void func4(vector<vector<int>>& vec){ int row = vec.size(); int col = vec[0].size(); vector<vector<int>> Path(row ,vector<int>(col,0)); for (int i = 0; i < row; ++i) { if (vec[i][0] != 1) Path[i][0] ...原创 2020-06-23 16:25:10 · 119 阅读 · 0 评论 -
动归---2
01背包问题字符串切割:另一种简单的写法:上面的代码时间复杂度是O(n^3),主要问题是在判断是否回文的位置,可能需要反复判断,这里就会使时间复杂度很搞,所以我们可以采用空间换时间的方式,使用二维数组,提前将每两个位置之间是否是回文串来保存起来,这样的话,在判断是否是回文串的时候直接查看矩阵就可以了。...原创 2020-06-23 16:25:19 · 95 阅读 · 0 评论 -
搜索---1
原创 2020-06-23 16:25:00 · 86 阅读 · 0 评论 -
搜索---2
#include<iostream>#include<string>#include<vector>using namespace std;int pos[4][2] = { { -1, 0 }, { 0, -1 }, { 1, 0 }, { 0, 1 } };//grid:提供的矩阵//row:矩阵有多少行//col:矩阵有多少列//visited:标记矩阵//curx:正在处理的点的横坐标//cury:正在处理的点的纵坐标void dfs(ve.原创 2020-06-23 16:24:51 · 132 阅读 · 0 评论