编程题
coolwriter
这个作者很懒,什么都没留下…
展开
-
剑指offer 编程题(16):判断是否子树
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NUL原创 2017-12-18 14:51:49 · 228 阅读 · 0 评论 -
剑指offer 编程题(49):数组中重复的数字
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。详见剑指offer27class Solution {public: // Parameters: //原创 2017-12-27 19:31:11 · 284 阅读 · 0 评论 -
剑指offer 编程题(46):求1+2+3+...+n
题目描述 求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。class Solution {public: int Sum_Solution(int n) { if(n == 1) return n; int sum = n+Sum_Soluti原创 2017-12-27 16:29:46 · 400 阅读 · 0 评论 -
剑指offer 编程题(47):不用算数运算符实现加法
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。class Solution {public: int Add(int num1, int num2) { int sum = num1 ^ num2; int carry = num1 & num2; while (carry) {原创 2017-12-27 18:23:15 · 228 阅读 · 0 评论 -
剑指offer 编程题(50):乘积数组
题目描述 给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…A[i-1]*A[i+1]…*A[n-1]。不能使用除法。class Solution {public: vector<int> multiply(const vector<int>& A) { vector<int> B; i原创 2017-12-28 11:36:46 · 235 阅读 · 0 评论 -
剑指offer 编程题(52):字符流中第一个不重复的字符
题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。 输出描述: 如果当前字符流没有存在出现一次的字符,返回#字符。class Solution{public: //Insert one char from strin原创 2017-12-28 16:48:25 · 196 阅读 · 0 评论 -
剑指offer 编程题(51):字符串形式的数值判断
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。class Solution {public: bool isNumeric(char* str) { int flag原创 2017-12-28 16:26:03 · 225 阅读 · 0 评论 -
剑指offer 编程题(53):链表中环的入口结点
一个链表中包含环,请找出该链表的环的入口结点。断链法 时间复杂度为O(n)两个指针,一个在前面,另一个紧邻着这个指针,在后面。 两个指针同时向前移动,每移动一次,前面的指针的next指向NULL。 也就是说:访问过的节点都断开,最后到达的那个节点一定是尾节点的下一个, 也就是循环的第一个。 这时候已经是第二次访问循环的第一节点了,第一次访问的时候我们已经让它指向了NULL, 所原创 2017-12-29 12:15:44 · 287 阅读 · 0 评论 -
剑指offer 编程题(54):删除链表中重复的结点
删除链表中重复的结点 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next原创 2017-12-29 17:06:40 · 323 阅读 · 0 评论 -
剑指offer 编程题(55):中序二叉树的下一个结点
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。class Solution {public: TreeLinkNode* GetNext(TreeLinkNode* pNode) { if(pNode==nullptr) return nullptr; //情况1.空树,返回空原创 2017-12-29 22:22:13 · 225 阅读 · 0 评论 -
剑指offer 编程题(48):string to int
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0 输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0 示例1 输入+2147483647 1a33 输出2147483647 0class Solution {public: int StrToI原创 2017-12-27 19:06:06 · 199 阅读 · 0 评论 -
剑指offer 编程题(60):滑动窗口最大值
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {原创 2018-01-03 11:56:03 · 527 阅读 · 0 评论 -
剑指offer 编程题(21):二叉树层次打印
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。class Solution {public: vector<int> PrintFromTopToBottom(TreeNode* root) { queue<TreeNode*> q; vector<int> res; if(root == NULL) {原创 2017-12-19 16:45:16 · 243 阅读 · 0 评论 -
剑指offer 编程题(44):扑克牌顺子
0代表任意数,判断数组是否为顺子。class Solution {public: bool IsContinuous( vector<int> numbers ) { if(numbers.size() <= 0) { return false; } int arr[14] ={0};原创 2017-12-26 17:06:26 · 279 阅读 · 0 评论 -
剑指offer 编程题(17):二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述: 二叉树的镜像定义:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {原创 2017-12-18 15:07:07 · 200 阅读 · 0 评论 -
剑指offer 编程题(18):顺序打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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&lt;int&gt; printMatrix(vector&lt;vecto原创 2017-12-18 15:46:52 · 319 阅读 · 0 评论 -
剑指offer 编程题(19):自定义栈输出最小值
题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。class Solution {public: stack<int> a; stack<int> s; void push(int value) { s.push(value); if(a.empty()) { a.pus原创 2017-12-18 16:36:16 · 224 阅读 · 0 评论 -
剑指offer 编程题(40):和为S的连续正数序列
题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述: 输出所有和为S的连续正数序列。序原创 2017-12-25 21:36:53 · 225 阅读 · 0 评论 -
剑指offer 编程题(41):查找两数之和一定,乘积最小
题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述: 对应每个测试案例,输出两个数,小的先输出class Solution {public: vector<int> FindNumbersWithSum(vector<int> array,int sum) { vector<in原创 2017-12-26 13:24:43 · 399 阅读 · 0 评论 -
剑指offer 编程题(27):数组中出现次数统计
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0class Solution {public: int MoreThanHalfNum_Solution(vector<int> numbers) { if(n原创 2017-12-21 20:52:34 · 444 阅读 · 0 评论 -
剑指offer 编程题(45):圆圈中最后剩下的数(约瑟夫环)
class Solution {public: struct node { int no; node *next; }; int LastRemaining_Solution(int n, int m) { node *head=new node; head->no=n-1; h原创 2017-12-27 15:15:46 · 269 阅读 · 0 评论 -
剑指offer 编程题(20):栈的压入和弹出序列比较
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)class Solution {public: bool IsPopOrder(vec原创 2017-12-19 16:04:07 · 202 阅读 · 0 评论 -
剑指offer 编程题(56):二叉树的层次遍历
题目描述 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }原创 2017-12-30 11:02:52 · 261 阅读 · 0 评论 -
剑指offer 编程题(57):二叉树的之字形打印
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x)原创 2017-12-30 12:26:51 · 187 阅读 · 0 评论 -
最小编辑代价(最小编辑距离)
题目描述:给定两个字符串str1和str2,再给定三个整数ic,dc,rc,分别代表插入、删除、替换一个字符的代价,返回将str1编辑成str2的最小代价。 举例: str1=”abc” str2=”adc” ic=5 dc=3 rc=2,从”abc”编辑到”adc”把b替换成d代价最小,为2; str1=”abc” str2=”adc” ic=5 dc=3 ...原创 2018-07-26 16:11:07 · 2150 阅读 · 0 评论 -
字符串交错组成
给定str1,str2,aim,若aim是仅包含str1,str2中的字符。若aim中属于str1的字符仍然保持在str1中原来的顺序,属于str2的字符仍然保持在str2中原来的顺序,则称aim是str1和str2的交错组成。思路:构造一个(M+1)*(N+1)的矩阵dp:dp[0][0]=true.aim为空时可以由str1和str2的空字符串组成2.dp[i][0]表示a...原创 2018-07-26 20:37:03 · 835 阅读 · 0 评论 -
字符串通配
题目描述 对于字符串A,其中绝对不含有字符’.’和’’。再给定字符串B,其中可以含有’.’或’’,’’字符不能是B的首字符,并且任意两个’’字符不相邻。exp中的’.’代表任何一个字符,B中的’’表示’’的前一个字符可以有0个或者多个。请写一个函数,判断A是否能被B匹配。给定两个字符串A和B,同时给定两个串的长度lena和lenb,请返回一个bool值代表能否匹配。保证两串的长度均小于等于3...转载 2018-07-26 21:20:53 · 725 阅读 · 0 评论 -
筛选素数
#include <cstdlib> #include <cmath> using namespace std; const int MAX=1000; int main() { int i=0,j=0,n=sqrt(MAX)+1; int a[MAX+1]={0}; for(i=2;i<=n;i++...原创 2018-08-06 16:44:27 · 247 阅读 · 0 评论 -
数组中和为某一个定值
#include<iostream> #include<vector> #include <algorithm> using namespace std; void findpath(vector<int> a,vector<int> path,int n,int start,int sum){ for...原创 2018-08-02 10:02:40 · 666 阅读 · 0 评论 -
找出1到n中重复的数字
背景:很早以前在CSDN中MoreWindows的白话算法中看到,以为那个就是最佳的方法,后来在LeetCode中做到,再后来在和同学讨论中又深化了一下。一道很经典的题目,算法无止境。题目:在数组nums[n + 1]中,数字都是1到n范围内的,那么至少有一个重复数字,找到它。分析:这其实是一道比较简单的算法题,但是,如果是面试题,面试官除了用时间复杂度和空间复杂度来约束你...转载 2018-08-02 16:22:46 · 5403 阅读 · 2 评论 -
最大连续子序列
链接:https://www.nowcoder.com/questionTerminal/afe7c043f0644f60af98a0fba61af8e7?toCommentId=2063699来源:牛客网给定K个整数的序列{ N1, N2, …, NK },其任意连续子序列可表示为{ Ni, Ni+1, …, Nj },其中 1 <= i <= j <= K。最大连续子序列...原创 2019-01-07 21:51:36 · 413 阅读 · 0 评论 -
二叉树的最大距离(即相距最远的两个叶子节点)
求两个节点之间最远的距离: (1)两个节点都是叶子结点 (2)一个是叶子结点一个是根节点思路: (1)如果具有最远距离的两个节点经过了根节点,那么最远的距离就是左边最深的深度加上右边最深的深度之和。 (2)如果具有最远距离的两个节点之间的路径不经过根节点,那么最远的距离就在根节点的其中一个子树上的两个叶子结点。 int GetDistance...原创 2019-02-11 16:53:31 · 6728 阅读 · 2 评论 -
洗牌算法
换位置法基本思路是:先初始化一串分布的数字,然后为每个位置依次生成一个与之交换的随机位置,如果生成的随机位置不是它本身就执行交换操作。实现代码:void swap(int& a, int& b) { a = a^b; b = a^b; a = a^b; } size_t shuffle2(int s[], int n) { ...原创 2018-07-23 17:24:22 · 679 阅读 · 0 评论 -
strcpy函数 和 strstr函数
大家一般认为名不见经传strcpy函数实现不是很难,流行的strcpy函数写法是: char *my_strcpy(char *dst,const char *src) { assert(dst != NULL); assert(src != NULL); char *ret = dst; while((* dst++ = * src+...转载 2018-06-03 20:55:14 · 505 阅读 · 0 评论 -
最长递增子序列LIS
问题给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)。例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8},则其最长的单调递增子序列为{5,6,7,8},长度为4.最长递增子序列O(NlgN)算法假设存在一个序列d[1..9] ={ 2,1 ,5 ,3 ,6,4, 8 ,9, 7},可以看出来它的LIS长度为5。 下面一步一步试转载 2017-12-17 12:01:19 · 253 阅读 · 0 评论 -
确定一个字符串的所有字符是否全都不同
请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。 测试样例: “aeiou” 返回:True “BarackObama” 返回:False#incl原创 2018-01-15 17:27:38 · 1275 阅读 · 0 评论 -
回溯法,八皇后问题
在国际象棋中,皇后是最强大的一枚棋子,可以吃掉与其在同一行、列和斜线的敌方棋子。比中国象棋里的车强几百倍,比她那没用的老公更是强的飞起(国王只能前后左右斜线走一格)。上图右边高大的棋子即为皇后。 八皇后问题是这样一个问题:将八个皇后摆在一张8*8的国际象棋棋盘上,使每个皇后都无法吃掉别的皇后,一共有多少种摆法?此问题在1848年由棋手马克斯·贝瑟尔提出,岂止是有年头,简直就是有年头,8原创 2018-01-06 11:38:14 · 361 阅读 · 0 评论 -
两种冒泡排序的比较及冒泡算法优化
第一种:void bubbleSort(int array[],int len){ //循环的次数为数组长度减一,剩下的一个数不需要排序 for(int i=0;i1;++i){ bool noswap=true; //循环次数为待排序数第一位数冒泡至最高位的比较次数 for(int j=0;j1;++j){原创 2018-01-30 19:49:02 · 354 阅读 · 0 评论 -
二叉树总结
1.二叉树创建class Solution{public: TreeNode* reConstructBinaryTree(vector pre,vector vin) { if(pre.size()<=0||vin.size()<=0) return NULL; TreeNode *root=new TreeNode原创 2018-01-07 18:19:51 · 710 阅读 · 0 评论 -
构造数组
给定一数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]…a[N-1] / a[j],在构造过程中,不允许使用除法:要求O(1)空间复杂度和O(n)的时间复杂度;除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、堆空间和全局静态变量等);实现程序(主流编程语言任选)实现并简单描述。 这道题目最为独特的要求就是除去遍历转载 2018-01-07 20:44:30 · 1064 阅读 · 0 评论