
刷题
centor
这个作者很懒,什么都没留下…
展开
-
C++实现atoi
class Solution {public: int myAtoi(string str) { int i = 0; int sign = 1; long ret = 0; while(str[i]==' ' && str.size()>i) { i++; ...原创 2020-01-31 21:14:36 · 629 阅读 · 0 评论 -
无重复字符最长子串(C++)
题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "w...原创 2019-11-01 15:07:34 · 2274 阅读 · 0 评论 -
使用两个栈实现一个队列+使用两个队列实现一个栈
两个问题中数据的出入我只说出,进的问题都一样没什么要讲的东西。两个栈实现一个队列如下图所示: 根据栈的先进先出特性,和要实现的队列的先进后出特性。首先定义一个spush存储数据,另一个spop用以操作数据,图中红框内为实现的Myqueue,spush中1、2、3、4、5、6为入栈顺序也是压入队列的顺序,那么出栈顺序为6、5、4、3、2、1,首先spush出栈,压入spop,达到下次出栈顺序为1原创 2017-09-19 18:36:43 · 313 阅读 · 0 评论 -
8个小球找其中一个较重的,其余小球质量相等
最多两次 1. 先取其中六个球,天平两端各三个 2. 若天平平衡,则剩下的两个里拿出来对比得出(两次) 3. 若天平不平衡,拿出较重的三个里的两个(1.不平衡则找出、2.平衡则剩下一个较重)原创 2017-09-22 10:19:31 · 3501 阅读 · 0 评论 -
一个数组中有一个数字的次数超过了数组的一半,求出这个字符
int a[]={2,3,2,2,2,2,2,5,4,1,2,3},求出超过一半的数字是2 一一抵消,计数器表示超出一半的元素与其他元素抵消后剩余个数int MoreThanHalfNum(int *arr, int size){ if (arr == NULL || size < 0) return NULL; int count = 1; int r原创 2017-09-19 18:34:35 · 358 阅读 · 0 评论 -
查找一个字符串中第一个只出现两次的字符
“abcdefabcdefabc”中第一个只出现两次为‘d’,要求时间复杂度为O(N),空间复杂度为O(1) 解题思路:用一个256个元素的数组存储各字符出现次数,遍历该数组,得到出现次数为两次的字符char FindSecond(const char* str, int len){ assert(str); char arr[256]={0}; for (int ...原创 2017-09-19 18:31:54 · 726 阅读 · 0 评论 -
实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、 Min(返回最小值的操作)的时间复杂度为O(1)
利用两个栈 1. 一个用来存储最小的元素 smin 2. 一个用来存储所有元素 scur 3. 入栈时,scur直接压入,smin栈顶与目标元素比较,若小之则压入,否则不做处理 4. 出栈时,scur直接出栈,smin栈顶与scur栈顶比较,若等之,则出栈,否则不做处理class Stack{public: void Push(const int& data) {原创 2017-09-19 18:30:04 · 1379 阅读 · 0 评论 -
计算一个整数二进制位中1的个数
int Get_count(int n)//方法一{ int count=0; while (n) { ++count; n=n&(n-1); }}int Get_count(int n)//方法二{ int count=0; unsigned int flag=0; while (flag) {原创 2017-09-19 18:25:14 · 461 阅读 · 0 评论 -
给定一个整数N,那么N的阶乘N!末尾有多少个0
//例如:N=10,N!=3 628 800,N!的末尾有两个0。 //如果N是一个很大的数,它的阶乘可能已超出计算机所能计算的最大范围,因此可能会导致溢出。 //我们换个角度想, N!=1×2×3×4×5×6×··· ×N //我们可以对N!进行分解质因数,即 //N!=(2^x)×(3^y)×(5^z) ·········· //可以看到2和5相乘必然会产生一个10,而这个10会在阶乘原创 2017-09-19 18:23:55 · 1260 阅读 · 0 评论 -
二叉树的层序遍历
利用队列 每次先入栈根 遍历栈顶(根) 出栈 然后依次入栈左右孩子 只要struct Node{ T _data; Node* _pLeft; Node* _pRight;};void LevelOrder(){ queue<T> q; Node* treenode; if (treenode==NULL) {原创 2017-09-19 18:19:59 · 307 阅读 · 0 评论 -
元素出栈、入栈顺序的合法性
如:入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1),则合法。 入栈的序列(1,2,3,4,5),出栈序列为(4,5,2,3,1),则不合法。template<class T>class Legitimacy{public: bool Legitimacy(const T* cur, const T* dest, int csize,int dsize) {原创 2017-09-19 18:10:11 · 344 阅读 · 0 评论 -
链表翻转
反转链表 给出一个链表和一个数k, //比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5, //若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6, //用程序实现Node* RotateList(Node* list, size_t k). 提示:这个题是链表逆置的升级变型。解法思路: 1.先反转前K个节点,保存后面的链表头,返回反转后的链原创 2017-09-19 18:03:27 · 291 阅读 · 0 评论 -
一个m*n的矩阵,从左到右从上到下都是递增的,给一个数x,判断x是否在矩阵中
根据题意可知,最大每行最大数在本行最后一个数;每列最大数在本列最后一个数 解法:每次与最右上角数字比较,若小之,排除次列;若大之,排除此行,实现快速查找bool Existence(int arr[][5],int k){ int row=0; int col=4; while (row<=4 && col>=0) { if (k<arr[row]原创 2017-09-19 16:44:03 · 2394 阅读 · 0 评论 -
判断一棵二叉树是否是平衡二叉树/求一颗二叉树的镜像
判断一棵二叉树是否是平衡二叉树判断每个节点的做右子树高度差,递归法求一颗二叉树的镜像交换左右孩子节点template<class T>struct TreeNode{ TreeNode* _Lchild; TreeNode* _Rchild; T data;};size_t Hight(TreeNode* pRoot){ if (pRoot==NULL)原创 2017-09-19 16:33:50 · 323 阅读 · 0 评论