Algorithm
行者小朱
stay hungry,stay foolish
展开
-
顺时针打印矩阵
题意描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如输入以下:1 2 3 4 5 6 7 89 10 11 1213 14 15 16输出:1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10解题思路一:《剑指offer》上给出的解法是第一步打印上(1--4),第二步打印右(8--16),原创 2016-06-03 17:05:39 · 337 阅读 · 0 评论 -
获取当前时间的下一天时间
题意描述:程序实现获取当前时间的下一天的时间解题思路:最暴力的解法就是首先获得当前时间的年月日时分秒信息,然后依次再day+1得到后面一天的时间;如果day+1是月底,则month+1;如果month+1是年底,则year+1;然后还要判断每个月的天数、是否是闰年等问题,会发现一个简单的问题会变得异常复杂于是就想到Java中的Date类来处理日期格式,通过它获得日期信息,而Date类的底层原创 2016-08-16 09:32:38 · 2701 阅读 · 0 评论 -
LeetCode---UglyNumberII解题分析
题意描述:UglyNumber的定义为一个数分解后只包含2、3、5因子,比如6、8是UglyNumber而14不为UglyNumber,1是典型的UglyNumber。求第N个UglyNumber解题思路一:逐个判断每个数字是否为UglyNumber至第N个UglyNumber为止,而判断每个数字是否为UglyNumber就是根据定义依次除去因子5、3、2,当不能再被5、3、2整除时是1就是U原创 2016-05-05 14:37:51 · 590 阅读 · 0 评论 -
LeetCode---Remove Duplicate Letters解题分析
题意描述:给定一个只包含小写字母的字符串,删除字符串中重复的字符,然后返回新的字符串是字典顺序排中最小的(不能打乱其原本的相对位置)。如:给定 "bcabc",返回 "abc"; 给定 "cbacdcbc",返回 "acdb"解题思路一:刚开始拿到这个题目时想法很简单,但忽略了括号里面的东东,提交报错后才突然发现加了括号里面的东东后题目难度大大提升。首先统计出每个字符出现的次数,用vis原创 2016-06-07 16:53:01 · 2015 阅读 · 0 评论 -
二叉树中和为某一值的路
题意描述:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。如: 10 / \ 5 12 / \ 4 7解题思路:借助栈,进行深度优先遍历,如果当前结点为叶子结点并且从根结点到当前结点的值的和等于给定值,则找到一条路径并打印原创 2016-06-18 19:19:10 · 488 阅读 · 0 评论 -
替换字符串中的空格(C++/Java实现)
题意描述:题意描述:实现一个函数把字符串中的每个空格替换成“20%”。例如:输入:“we are happy”输出:“we%20are%20happy”解题思路:(C++实现方法)如果从前往后遍历,遇到空格再将字符向后移动,则假设有O(n)个空格的时间效率就是O(n^2)。因此优化的解法就是一次移到位,先遍历一次字符串,可同时得到字符串的长度和字符串中空格的数量,然后对于1个空格用原创 2016-05-09 09:18:08 · 2183 阅读 · 0 评论 -
数值的整数次方
题意描述:实现函数double Power(double base, int exp),求base的exp次方,不得使用库函数,同时不用考虑大数问题解题思路:这样的题目通常情况下会直接写出如下代码double Power(double base, int exponent) { double result = 1; for (int i = 0; i < exponent; ++i)原创 2016-05-23 11:10:27 · 528 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面及运用解耦方法解决扩展问题
问题描述:输入一个数组,实现一个函数将数组中数字重新排序,使得所有奇数位于数组的前面,所有偶数位于数组的后面解题思路:借鉴快排的思想,使用两个指针,指针1指向数组第一个元素(从前向后遍历),指针2指向数组最后一个元素(从后向前遍历),当指针1指向元素为偶且指针2指向元素为奇时交换两元素,当两指针相遇时遍历结束void ReorderOddEven(int* pData, int len原创 2016-05-25 10:11:30 · 463 阅读 · 0 评论 -
二维数组中的查找
题意描述:在一个二维数组中,每一行都按从左到右的递增顺序排序,每一列也按照从上到下的递增顺序排序完成函数,输入一个这样的一个二维数组和一个整数,判断是否含有该整数例如:1 2 892 4 9124 7 10136 8 1115如果查找7返回true,如果查找5返回false解题思路:依次从右上遍历,如果当前值等于给定值,返回tru原创 2016-06-03 08:54:55 · 288 阅读 · 0 评论 -
软件版本字符串排序
题意描述:软件的版本号一般是由数字和“.”组成的字符串,现比较两个字符串version1和version2,如果version1>version2返回1,如果version解题思路:字符串由数字和"."组成,所以先将字符串通过split()转化为字符数组,再逐位比较如果index=i区别出来了直接返回,否则比较index=i+1位int compareVersion(String vers原创 2016-06-04 15:18:47 · 2250 阅读 · 0 评论 -
找到栈最小元素
题意描述:定义栈的数据结构,请在该类型中实现一个能够找到栈最小元素的min函数。在该栈调用min、push、pop的时间复杂度都是O(1)解题思路:引用数据栈和辅助栈解题,入栈:数据栈中直接压入元素,当辅助栈空或者要压入的元素小于当前辅助栈栈顶元素时,辅助栈也压入该元素出栈:在数据栈不空的前提下,如果辅助栈栈顶元素与数据栈栈顶元素相等,则都弹出;否则只弹出数据栈栈顶元素得最小元素:原创 2016-06-06 15:54:19 · 2081 阅读 · 2 评论 -
栈的压入和弹出序列
题意描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。如:输入顺序:1,2,3,4,5则4,5,3,2,1是其输出顺序 但4,3,5,1,2不是其输出顺序解题思路:(1)如果下一个弹出的数字刚好是栈顶数字,那么直接弹出;(2)如果一下个弹出的数字不在栈顶,则把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶;(原创 2016-06-12 21:54:11 · 2449 阅读 · 0 评论 -
LeetCode---Bulb Switcher解题分析
题意描述:给定n个灯泡,初始化全为off,第一趟全问部on,第二趟将每第二个off,第三趟将每第三个反转……第n趟将第n个反转,最后返回灯泡处于on的数目。给定n=3,则有以下过程:开始时,3个灯泡[off, off, off];第一轮,3个灯泡[on, on, on];第二轮,3个灯泡[on, off, on];第三轮,3个灯泡[on, off, off]。所以最后返回1解题思路一:该方原创 2016-06-30 21:45:32 · 435 阅读 · 0 评论 -
树的子结构
题意描述:输入两棵二叉树A和B,判断B是不是A的子结构。如下判断右边的树是否为左边树的子结构二叉树的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};解题思路:依次判断B的根结点是否与A的某一结点相同,如果是则进一步判断B的子结点...原创 2016-06-30 21:19:10 · 442 阅读 · 0 评论 -
在O(1)时间内删除链表结点&&删除链表中重复节点
题意描述:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点解题思路:要求在O(1)时间内删除结点,则可以这样考虑:将给定结点后继结点的值赋给给定结点,然后删除给定结点的后继结点即可void DeleteNode(ListNode** pHead, ListNode* pToBeDeleted) { if (!pHead || !pToBeDeleted) r...原创 2016-06-30 21:05:43 · 971 阅读 · 0 评论 -
计算字符串的相似度
题意描述:给定任意两个字符串,写出一个算法计算它们的相似度许多程序会大量使用字符串,对于不同的字符串,我们希望能够有办法判断其相似程度。定义下列操作方法使得两个不同的字符串变得相同:(1)修改一个字符(如把‘a’改为‘b’);(2)增加一个字符(如把‘abdd’变为‘aebdd’);(3)删除一个字符(如把‘travelling’变为‘traveling’);比如,对于‘a原创 2016-08-16 09:45:28 · 725 阅读 · 0 评论 -
约瑟夫环的问题---最后剩下哪一个
题意描述:0,1,……,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里面删除第m个数字。求这个圆圈中最后剩下的一个数字解题思路一:模拟一个环,然后每次删除第m个数字解题思路二:上述思路可行,但明显时间复杂度O(mn)。因此还是希望找找删除数字有什么规律。 递归公式: 0 , n = 1原创 2016-08-16 10:10:04 · 2682 阅读 · 0 评论 -
LeetCode---Implement Queue Using Stacks、Implement Stack Using Queues解题分析
题意描述:用两个栈来实现一个队列的操作,用两个队列来实现一个栈的操作解题思路:用栈实现队列的操作:栈S1、S2分别用于入队、出队(1)入队:若S1不满直接将新元素放入S1,若S1满则将S1中元素转入S2,然后再将新元素放入S1;(2)出队:若S2不空则直接从S2弹出栈顶元素,若S2空则先将S1元素转到S2再弹出S2栈顶元素;public class ImplementQueue原创 2016-05-13 11:49:26 · 450 阅读 · 0 评论 -
判断一个链表是否是回文链表
题目描述:判断一个链表是否是回文链表(如何能达到时间复杂度为O(n)的同时空间复杂度为O(1))解题思路:最初的思路是遍历链表,取出其中的结点值拼成字符串,然后判断字符串是否是回文字符串,如下:boolean isPalindrome(ListNode head) { ListNode p = head; String str = ""; while(p != null){ st原创 2016-05-26 08:41:39 · 10194 阅读 · 8 评论 -
内部排序算法总结
/*** 对排序算法的整理* 1、插入排序:* (1)直接插入排序* (2)折半插入排序* (3)希尔排序* 2、交换排序:* (1)冒泡排序* (2)快速排序* 3、选择排序:* (1)简单选择排序* (2)堆排序* 4、归并排序和基数排序*/本文中的算法实现都对以下序列排序:int[] a = {3,1,5,7,...原创 2016-03-03 22:19:36 · 1050 阅读 · 0 评论 -
求最长连续子数组问题
题意描述:题目意思是说给定一个数数组num[]和一个值key,求满足和为key最长的子数组的长度【与求连续子数组的最大和互为姊妹题】解题思路:暴力解法肯定可以求解,如下所示:int getMaxLengthForce(int[] arr, int k) { int res = 0; for (int i = 0; i < arr.length; i++) { int sum...原创 2016-09-17 16:33:58 · 3392 阅读 · 0 评论 -
求连续子数组的最大和
题目一:给定一个数组,求该数组的最大子数组和题目二:给字一个数组,求该数组的最大两个子数组的和(子数组位置无重合)解题一:动态规划是最常想到的,但写起来十分麻烦,这里参考左神的解题思路,声明两个临时变量res和cur,res保存访问到当前元素所得的最大和,cur保存每次加上当前元素的和(注意:当cur小于0时,更新为0)。具体代码如下:int subArrayMaxSum(in原创 2016-09-17 16:22:29 · 569 阅读 · 0 评论 -
二叉树的建立及层次遍历及前中后序遍历递归与非递归的实现
该例主要展示Java实现二叉树,并实现二叉树的先序、中序和后序遍历public class Node { private int value; private Node left; private Node right; public Node(int value){ this.value = value; } public void insert(int value原创 2016-03-25 20:53:06 · 588 阅读 · 0 评论 -
利用快排思想寻找数组中第K大(小)的数字
利用快排的思想寻找数组中第K大(小)的数字。举例:给定一个整数数组num,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。如输入数组[1,3,5,2,2],5,3,返回:2。 解题思路:首先了解快排思想,即每次可以将一个元素放到最终位置上,所以如果当前放置的元素是第K个位置,即得到了最终的结果,不用继续进行排序操作。所以有以下代码。public原创 2016-11-17 09:59:37 · 4023 阅读 · 0 评论 -
写一个函数求PI的值
题意描述:写一个函数,求得PI的值解题思路一:公式法,Pi/4 = 1 - 1/3 + 1/5 + ……double getPi() { double pi = 0; int sign = 1; for(int i=1; i < 1e8; i+=2){ pi += sign / (1.0 * i); sign = -sign; } return 4 * pi;原创 2016-10-11 09:17:31 · 3698 阅读 · 0 评论 -
求一个排序数组中绝对值最小的数
题意描述:给定一个已排好序的数组,求数组中绝对值最小的元素解题思路一:直接遍历,时间复杂度为O(n),求得数组中绝对值最小的元素int getMinAbs(int[] num){ //当数组只有一个元素的情况直接返回 if(num.length == 1) return num[0]; //当数组非负时直接返回num[0],当数组非正时直接返回num[num.length-1原创 2016-10-11 09:29:51 · 3644 阅读 · 1 评论 -
把数组排成最小的数
题意描述:输入一个正整数数组,把数组里面所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个如:输入数组{3,32,321},则打印出这三个数字能排成最小的数字为321323解题思路:根据题意要求,两数字m和n能拼接成数字mn和nm。如果mn#include#include#include#includeusing namespace std;bool原创 2016-04-01 10:13:57 · 420 阅读 · 0 评论 -
求TopK问题
题意描述:输入n个整数,找出其中最小的k个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4解题思路一:先将n个整数排序,然后输出k个最小的数字即可vector findKMinNum(vector num, int k) { sort(num.begin(), num.end()); vector res; for (int i = 0;原创 2016-07-07 21:38:58 · 469 阅读 · 0 评论 -
求二叉树的最大深度、最小深度、反转二叉树及判断是否为平衡二叉树
该例主要实现二叉树深度的相关问题public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x){ val = x; } TreeNode(){ } //创建结点 static TreeNode CreateTreeNode(int value){ TreeN原创 2016-05-04 21:40:21 · 744 阅读 · 0 评论 -
程序实现sqrt()函数
题意描述:写一个程序实现sqrt()函数解题分析:平时用习惯了库orAPI,突然让写一个sqrt()函数,不免要思考一下。以下给出两种常见的解题思路方法一:二分法。以sqrt(3)为例,运算过程是这样的,任取一个初始值,比如这里取0,则有以下运算过程:(0+3)/2=1.5 1.5*1.5<3(1.5+3)/2=2.25 2.25*2.25>3(1.5+2.25)/2=1.原创 2016-09-16 11:41:34 · 2402 阅读 · 0 评论 -
判断给定的数组是否为二叉搜索树的后序遍历序列
题意描述:输入一个整数数组,判断该数组是不是某个二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。例如输入{5,7,6,9,11,10,8}返回true;输入{7,4,6,5}返回false对应的后序遍历结果为5、7、6、9、11、10、8解题思路:在后序遍历序列中,最后一个数字是树的根结点的值,前面的数字可分为两个部分:第一部分...原创 2016-06-17 09:50:44 · 756 阅读 · 1 评论 -
查找算法总结
一、顺序查找和折半查找1、顺序查找基本思想:从线性表的一端开始,逐个检查关键字是否满足条件。找到满足条件的元素,则查找成功;若查找到线性表另一端仍没有满足条件的元素,则查找失败int SeqSearch(int[] nums, int key){ for(int i=0; i<nums.length; i++) if(key == nums[i]) return i; r原创 2016-07-07 09:45:20 · 1434 阅读 · 0 评论 -
打印1到最大的N位数
题意描述:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印1、2、3……999解题思路一:先找到最大的那个数字,然后再从1开始循环打印void Print1ToMaxOfNDigits(int n) { int num = 1; int i = 0; while (i < n) { num *= 10; ++i; } for (int i = 0;原创 2016-06-30 21:01:17 · 699 阅读 · 0 评论 -
Number of 1 Bits(二进制中1的个数)
题意描述:写一个函数计算无符号整数二进制形式中1的个数。如“11”(二进制形式“00000000000000000000000000001011”)返回3;解题思路一:Java中没有unsigned int,这里采用通过移位来实现计数1的个数int hammingWeight(int n) { int count = 0; while(n != 0){//因为Java中没有无符号的整数原创 2016-06-04 14:58:41 · 1010 阅读 · 1 评论 -
LeetCode---Linked List Cycle、Linked List Cycle II解题分析
题意描述:给定一个单向链表,(1)判断其是否有环;(2)如果有环找出环结点。解题分析:一个单向链表如果有环,则必然存在最后一个结点的next指针指向链表中其他任意一个结点。如果单从结点上判断,这就相当于一没有尽头的死循环,所以一个指针肯定不行,就想到利用两个指针,然后以不同的速度从起点出发,如果两个指针能够相遇,则说明存在回路(证明就是小时常做的应用题目:小明和小红在操场跑步一个快一个慢,从一...原创 2016-05-17 21:29:24 · 863 阅读 · 0 评论 -
LeetCode---Valid Sudoku解题分析
题意描述:判断矩阵是否是一个数独矩阵。所谓的数独矩阵就是9*9的矩阵,每一行一个元素只出现一次、每一列一个元素只出现一次,并且在任意一个小矩阵中一个元素只出现一次(所说的元素指0-9这九个数字)矩阵如下图所示:解题分析:解题思路:注意题目中说的是只要当前已经填充的数字是合法的就可以,不一定要这个数独是有解的。依次判断已给定的矩阵每一行、每一列、以及每个小矩阵上是否是有重复数字即可;原创 2016-05-30 21:40:08 · 3089 阅读 · 2 评论 -
LeetCode---PowerOfTwo、PowerOfThree、 PowerOfFour解题分析
题意描述:给定一个整数,分别判断其是否为2的N次幂、3的N次幂、4的N次幂解题思路:对于2的N次幂的整数://解题思路一:2的N次幂都只有各位上只有一个1,剩下的全为0,所以可以参考NumberOfOneBits的思路//如果只有1个位上有1,则为2的幂指数private static boolean isPowerOfTwo(int n){ int count = 0; whil原创 2016-05-04 21:57:55 · 633 阅读 · 0 评论 -
LeetCode --- ExcelSheetColumnTitle 、ExcelSheetColumnNumber解题分析
题目描述:Excel表的每一列都是字母,问将其列字母转换成数字比如何转换,将数字兑换成列又如何转换。形式如下:1A2B3C……26Z27AA28AB……解题思路:该题目就是找到数字与字母之间的转换关系。对于给定的数字,1~26为A~Z、27~52为AA~AZ、然后是BA~BZ……所以确定两点:(1)计算时如果数字模26,则26个就对应0,所以应为n%25+1;(2)高位的原创 2016-03-21 15:51:50 · 420 阅读 · 0 评论 -
LeetCode---Super Ugly Number解题分析
题目描述:给定长度为K的质因子列表,编写程序寻找第N个SuperUglyNumber。例如:给定长度为4的质数序列primes={2,7,13,19},则对应前12个SuperUglyNumber序列为{1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32}解题思路:可以参考上一篇UglyNumberII的求解思路,即依次由小的SuperUglyNumber乘给定原创 2016-05-05 15:37:40 · 1027 阅读 · 0 评论 -
LeetCode --- Add Digits解题分析
题目内容:将一个非负整数,通过不断循环将各个位置上的数字相加,最终为一位数时即为所求结果。比如:num = 383 + 8 = 111 + 1 = 2结果就输出2解题思路一:蛮力求解,将数字逐位相加,循环这样做,至一位数时即为所求结果int solution1(int n){//调用getSum,判断返回值如果不是一位数继续调用getSum求和 int result =原创 2016-02-27 21:41:56 · 483 阅读 · 0 评论