算法
湘下农人
尽力而为还是全力以赴
展开
-
圆圈中最后剩下的数字
题目要求:0,1,2...n-1这n个数字拍成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字,求剩下的最后一个数字。例如0,1,2,3,4这5个数字组成的圈,每次删除第3个数字,一次删除2,0,4,1,因此最后剩下的是3。解题思路:最直接的思路是用环形链表模拟圆圈,通过模拟删除过程,可以得到最后剩下的数字,那么这道题目就变成了删除链表中某一个节点。假设总节点数为n,删除一个节点需要...转载 2018-08-12 10:53:24 · 145 阅读 · 0 评论 -
股票的最大利润
题目要求:求买卖股票一次能获得的最大利润。例如,输入{9,11,8,5,7,12,16,14},5的时候买入,16的时候卖出,则能获得最大利润11。解题思路:遍历过程中记录最小值min,然后计算当前值与min的差值diff,并更新maxDiff,maxDiff=max(diff)。public class P304_MaximalProfit { public static ...转载 2018-08-12 10:03:08 · 292 阅读 · 0 评论 -
n个骰子的点数
把n个骰子扔在地上,所有骰子朝上一面的点数之和为s,输入n,打印出s的所有可能出现的概率思路:递归一般是自顶向下的分析求解,而循环则是自底向上,占用更少的空间和更少的时间,性能较好。定义一个二维数组,第一次掷骰子有6种可能,第一个骰子投完的结果存到probabilities[0];第二次开始掷骰子,在下一循环中,我们加上一个新骰子,此时和为n的骰子出现次数应该等于上一次循环中骰子点数和为n-1...转载 2018-08-12 09:51:17 · 280 阅读 · 0 评论 -
滑动窗口的最大值
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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-08-12 09:07:58 · 132 阅读 · 0 评论 -
二叉树的深度
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { ...转载 2018-08-12 09:07:25 · 432 阅读 · 0 评论 -
输入两个链表,找出它们的第一个公共结点
思路:先求出链表长度,然后长的链表先走多出的几步,然后两个链表同时向下走去寻找相同的节点,代码量少的方法需要将两个链表遍历两次,然后从头开始相同的节点。代码实现:// 不需要遍历链表的解法public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { ListNode p1 = pHead1; ...转载 2018-08-12 09:07:05 · 391 阅读 · 0 评论 -
数组中的逆序对
题目要求:如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对总数。例如输入{7,5,6,4},一共有5个逆序对,分别是(7,6),(7,5),(7,4),(6,4),(5,4)。解题思路:思路1:暴力解决。顺序扫描数组,对于每个元素,与它后面的数字进行比较,因此这种思路的时间复杂度为o(n^2)。思路2:上述思路在进行比较后,并没有将相关...转载 2018-08-12 09:06:37 · 153 阅读 · 0 评论 -
丑数
题目要求:我们把只包含因子2,3,5的数成为丑数。求按照从小到大的顺序第1500个丑数。1作为第一个丑数。解题思路:思路1:从1开始递增,依次判断每个数是否是丑数,不够高效;思路2:思路1之所以效率低,比较关键的一点是遍历的每一个数字都进行丑数判断。思路2不是去判断丑数,而是计算出丑数:因为每个丑数都可以看成是由1去乘以2、3、5,再乘以2、3、5而衍生出来的。可以用三个指针指向第一个丑...转载 2018-08-12 09:06:18 · 402 阅读 · 0 评论 -
数组获取最大和最小值 Java
import java.util.Arrays;import java.util.Collections; public class Main { public static void main(String[] args) { Integer[] numbers = { 8, 2, 7, 1, 4, 9, 5}; int min = (int) Co...转载 2018-08-11 16:46:30 · 505 阅读 · 0 评论 -
最长不含重复字符的子字符串
题目要求:输入一个字符串(只包含a~z的字符),求其最长不含重复字符的子字符串的长度。例如对于arabcacfr,最长不含重复字符的子字符串为acfr,长度为4。解题思路:动态规划。用dp[]记录状态,dp[i]表示以下标为i的字符结尾不包含重复字符的最长子字符串长度。初始化dp[0] = 1,求maxdp。每次可以根据dp的前一个状态推导出后一个状态。import java.util...原创 2018-08-11 16:44:19 · 469 阅读 · 0 评论 -
把数字翻译成字符串(递归,动态规划)
题目要求:给定一个数字,按照如下规则翻译成字符串:0翻译成“a”,1翻译成“b”...25翻译成“z”。一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcfi,mzi。实现一个函数,用来计算一个数字有多少种不同的翻译方法。解题思路:下面我们从自上而下和自下而上两种角度分析这道题目,以12258为例:自上而下,从最大的问题开始,递归 : ...转载 2018-08-11 15:49:46 · 2809 阅读 · 1 评论 -
字符串的排列
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。import java.util.ArrayList;import java.util.Iterator;import java...原创 2018-08-11 12:59:12 · 127 阅读 · 0 评论 -
二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { thi...转载 2018-08-11 09:49:43 · 72 阅读 · 0 评论 -
复杂链表的复制
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)/*public class RandomListNode { int label; RandomListNode next = null; RandomL...转载 2018-08-11 09:21:46 · 102 阅读 · 0 评论 -
二叉树中和为某一值的路径
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)import java.util.ArrayList;/**public class TreeNode { int val = 0; TreeNode left = null...转载 2018-08-11 09:07:29 · 95 阅读 · 0 评论 -
把字符串转换成整数
将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0public class Solution { ...原创 2018-08-12 12:31:38 · 10836 阅读 · 0 评论 -
二叉树的下一个结点
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:(1) 若该节点存在右子树:则下一个节点为右子树最左子节点(如图节点 B )(2) 若该节点不存在右子树:这时分两种情况:2.1 该节点为父节点的左子节点,则下一个节点为其父节点(如图节点 D )2.2 该节点为父节点的右子节点,则沿着...转载 2018-08-08 16:42:13 · 99 阅读 · 0 评论 -
替换空格
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。方法一:public class Solution { public String replaceSpace(StringBuffer str) { if(str==null){ re...转载 2018-08-08 17:19:17 · 82 阅读 · 0 评论 -
自适应遗传算法(每代保优解)
三相负荷不平衡优化问题:以电流不平衡度小和换相开关次数少建立模型并编码,采用如下算法求解% 自适应向量基因遗传算法(每代保优解) %%种群规模100 迭代次数80 %% F=P×I_max (K)+(1-P) × H(K) 染色体长度16 %% %%------------------------------------------------------------------...原创 2019-05-18 15:55:12 · 1898 阅读 · 1 评论 -
自适应遗传算法
三相负荷不平衡优化问题求解:以电流不平衡度小和换相开关次数少建立模型并编码,采用如下算法求解% 自适应向量基因遗传算法 %%种群规模100 迭代次数80 %% F=P×I_max (K)+(1-P) × H(K) 染色体长度16 %% %%-----------------------------------------------------------------------...原创 2019-05-18 15:53:12 · 8473 阅读 · 2 评论 -
标准遗传算法举例
% 标准遗传算法 %% 求下列函数的最大值 %% f(x)=10*sin(5x)+7*cos(4x) x∈[0,10] %% 将 x 的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为 (10-0)/(2^10-1)≈0.01 。 %% 将变量域 [0,10] 离散化为二值域 [0,1023], x=0+10*b/1023, 其中 b 是 [0,1023] 中的...转载 2019-05-16 20:02:27 · 2606 阅读 · 0 评论 -
遗传算法的交叉变异操作杂记
100个个体,交叉概率为0.1,并不代表交叉个体数为10个.这是一个概率问题.另外,交叉概率一般会取0.5-1这个范围内,0.1未免有点小.自适应的遗传算法,一般在迭代初期会有较大的交叉概率,越往迭代后期,交叉概率越小.而变异概率则相反.标准的交叉如下: 假设六个个体的编号为从1至6,两两配对共分为3对母代个体。 第1对母代个体:随机生成一个随机数r,如果r<=0.6,则进行交叉。交...转载 2019-05-08 19:22:18 · 17742 阅读 · 0 评论 -
经典大数据面试题
1.海量日志数据,提取出某日访问百度次数最多的那个IP。首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后...转载 2019-03-29 17:31:00 · 452 阅读 · 0 评论 -
拼最大数问题(java)
题目描述:有n个正整数,请将它们拼接成一排,组成一个最大的多位整数。例如:n=3时,3个整数13,312,343拼接成的最大整数为:34331213。输入第一行为正整数个数n(n<=10000),第二行n个以空格相隔的正整数(integer类型)输出输出一行表示答案样例输入3 13 312 343样例输出34331213代码:import java.util.A...原创 2018-09-30 10:13:21 · 722 阅读 · 0 评论 -
Repeated Substring Pattern
Given a non-empty string check if it can be constructed by taking a substring of it and appending multiple copies of the substring together. You may assume the given string consists of lowercase Engli...转载 2018-09-29 18:45:49 · 194 阅读 · 0 评论 -
Java Arrays类进行数组排序
Java API对Arrays类的说明是:此类包含用来操作数组(比如排序和搜索)的各种方法。1.对基本数据类型的数组的排序 说明:(1)Arrays类中的sort()使用的是“经过调优的快速排序法”; (2)比如int[],double[],char[]等基数据类型的数组,Arrays类之只是提供了默认的升序排列,没有提供相应的降序排列方法。 (3)要对基础...转载 2018-09-15 14:23:29 · 473 阅读 · 0 评论 -
给定一个字符串,找到最长子串的长度,而不重复字符。
描述:给定一个字符串,找到最长子串的长度,而不重复字符。例子:给定"abcabcbb"的答案是"abc",长度是3。给定"bbbbb"的答案是"b",长度为1。给定"pwwkew"的答案是"wke",长度为3.请注意,答案必须是子字符串,"pwke"是子序列,而不是子字符串。我的方法:(时间复杂度较大)public static int转载 2018-09-12 21:04:06 · 3995 阅读 · 0 评论 -
构造二叉树,并求二叉树的深度
import java.util.ArrayList;import java.util.LinkedList;import java.util.Map;import java.util.Scanner;import java.util.TreeMap;//构造二叉树,并求二叉树的深度public class Test { /** * @param args ...原创 2018-09-16 22:29:48 · 241 阅读 · 0 评论 -
二叉树的层次遍历(按层换行打印)
思路增加两个TreeNode:last和nlastlast:表示当前遍历层最右结点nlast:表示下一层最右结点遍历时,每次将nlast指向插入队列元素,最后一个插入结点时即最右结点。插入左右孩子之后,检测last是否为当前输出结点,若是,则表示需要进行换行,并将last指向下一层的nlast。代码/*public class TreeNode { int data;...转载 2018-09-16 13:00:10 · 1807 阅读 · 0 评论 -
Java遍历Map对象的四种方式
方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式。在键值都需要时使用。 1 2 3 4 Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for (Map.Entry<Integer, Integer> entry ...转载 2018-09-15 17:40:36 · 120 阅读 · 0 评论 -
双生词-字节跳动的笔试
import java.util.Scanner;import java.util.regex.Matcher;import java.util.regex.Pattern;public class Main { /** * @param args */ public static void main(String[] args) { ...原创 2018-08-25 16:31:40 · 763 阅读 · 0 评论 -
树中两个节点的最低公共祖先
题目要求:输入一棵树的根节点,输入两个被观察节点,求这两个节点的最低(最近)公共祖先。解题思路:此题比较开放,主要是对于“树”没有做明确说明,所以原书中就对树的可能情况做了假设,然后就衍生出多种思路1)如果是二叉,搜索树: 遍历找到比第一个节点大,比第二个节点小的节点即可2)如果是父子间有双向指针的树: 由下往上看,转化为找两个链表的第一个公共节点问题3)如果只是...转载 2018-08-25 16:29:54 · 395 阅读 · 0 评论 -
密码验证合格程
密码要求:1.长度超过8位2.包括大小写字母.数字.其它符号,以上四种至少三种3.不能有相同长度超2的子串重复说明:长度超过2的子串输入描述:一组或多组长度超过2的子符串。每组占一行输出描述:如果符合要求输出:OK,否则输出NG示例1输入021Abc9000021Abc9Abc1021ABC9000021$bc9000输出OKNG...转载 2018-08-08 17:31:24 · 170 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路:BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列。完美的递归定义 : ) 。...原创 2018-08-11 09:03:01 · 104 阅读 · 0 评论 -
按之字形顺序打印二叉树
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。import java.util.ArrayList;import java.util.Stack;/*public class TreeNode { int val = 0; TreeNode left = null; ...转载 2018-08-11 09:00:46 · 101 阅读 · 0 评论 -
击鼓传花
题目描述学校联欢晚会的时候,为了使每一个同学都能参与进来,主持人常常会带着同学们玩击鼓传花的游戏。游戏规则是这样的:n个同学坐着围成一个圆圈,指定一个同学手里拿着一束花,主持人在旁边背对着大家开始击鼓,鼓声开始之后拿着花的同学开始传花,每个同学都可以把花传给自己左右的两个同学中的一个(左右任意),当主持人停止击鼓时,传花停止,此时,正拿着花没传出去的那个同学就要给大家表演一个节目。聪明的小赛提出一...转载 2018-07-08 10:55:36 · 399 阅读 · 0 评论 -
有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或者二级,要走上m级,共有多少走法?
有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或者二级,要走上m级,共有多少走法?注:规定从一级到一级有0种走法。 给定一个正整数int n,请返回一个数,代表上楼的方式数。保证n小于等于100。为了防止溢出,请返回结果Mod 1000000007的值。 我们走的最后一步,有几种可能。就是两种,一种是走一步,一种是走两步。拿我们走到十台阶的可能数就可以分为两类F(8)和F(9)。那么我们F...转载 2018-07-08 10:34:00 · 5432 阅读 · 1 评论 -
二分法查找
(1)确定该区间的中点位置:mid=(low+high)/2 min代表区间中间的结点的位置,low代表区间最左结点位置,high代表区间最右结点位置(2)将待查a值与结点mid的关键字(下面用R[mid].key)比较,若相等,则查找成功,否则确定新的查找区间:如果R[mid].key>a,则由表的有序性可知,R[mid].key右侧的值都大于a,所以等于a的关键字如果存在,必然在R...转载 2018-06-29 17:13:34 · 389 阅读 · 0 评论 -
基数排序
(一)基数排序的思想:把待排序的整数按位分,分为个位,十位.....从小到大依次将位数进行排序。实际上分为两个 过程:分配和收集。 分配就是:从个位开始,按位数从小到大把数据排好,分别放进0--9这10个桶中; ...转载 2018-06-29 16:02:00 · 550 阅读 · 0 评论 -
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
方法一:public class Solution { public int NumberOf1(int n) { int t=0; char[]ch=Integer.toBinaryString(n).toCharArray(); for(int i=0;i<ch.length;i++){ if(...原创 2018-06-08 22:38:41 · 189 阅读 · 0 评论