1、算法很美
算法很美
Estrellas_
I am the king of the world.
展开
-
第七章 递归、DFS、剪枝、回溯等问题 ------------- 7.5 “逐步生成结果”之非数值型问题 (合法括号)
题目一: 输入括号对数,输出所有的合法组合,比如输入1,输出"()",输入3,输出"()()(), (()()), ()(()), (())(), ((()))"。 思路:比如输入1,输出"()",那么输入2的话,我们就可以在输入1的基础上往左插入一对括号,往右插入一对括号以及把它用括号包含起来。这样的话左边和右边是相同的,我们可以用set集合来去除重复。画个示意图如下: 代...转载 2019-03-28 17:45:32 · 232 阅读 · 0 评论 -
第六章 数学问题 -------- 6.5 欧几里得算法及其扩展
先来看看欧几里得算法:public class Gcd { /** * 欧几里德算法,即辗转相除法 最大公约数 */ public static long gcd(long m, long n) { return n == 0 ? m : gcd(n, m % n); } /** * 最小公倍数lowest co...转载 2019-03-22 00:02:21 · 230 阅读 · 0 评论 -
第六章 数学问题 -------- 6.4 算法必备求和公式
转载 2019-03-21 23:59:00 · 600 阅读 · 0 评论 -
第六章 数学问题 -------- 6.2【Nim游戏】高僧斗法
先来看看Nim定理:// 若干堆硬币,二人轮流取,从一堆硬币中取几个 直到某个人不能取硬币 那这个人就输了// 3 4 5// 3 3 把硬币变成相同的 那么你就赢了 因为你可以跟着另一个人一样的取法// 尼姆定理: 无偏差的二人游戏 ===== 尼姆堆/* * 11 * 100 * ^ 101 * --------...转载 2019-03-21 23:56:28 · 245 阅读 · 0 评论 -
第六章 数学问题 -------- 6.1【巧用进制】天平称重问题
注意程序输出:+号代表放在左盘,-号放在右盘。1、思路: 联想二进制枚举,这里显然其实是一种三进制枚举。这里本质上是选或不选的问题,就是要将砝码放左or放右即+or-表达式的问题。但是得到的三进制值是由0 1 2组成,不好准确的表达是选还是不选的问题,于是我们可以想办法把0 1 2变成1 0 -1。于是我们可以对三进制数2进行进位操作,然后在减1,这样就把三进制全部...转载 2019-03-21 23:52:00 · 327 阅读 · 0 评论 -
第四章:多维数组和矩阵 ----------- 4.2 基础题:将0所在的行列清零
将0所在的行列清零:#include<iostream>#include<vector>using namespace std;void solve(vector<vector<int> > matrix,int rowLen,int colLen){ //记录哪些行出现了0 int rowRecord[rowLen]; f...原创 2019-03-13 16:45:34 · 282 阅读 · 0 评论 -
第四章:多维数组和矩阵 --------------- 4.1 基础题:顺时针打印二维数组
顺时针打印二维数组:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:1 2 3 4 56 7 8 9 1011 12 13 14 1516 17 18 19 20则依次打印出数字1 2 3 4 5 10 15 20...原创 2019-03-13 15:50:59 · 218 阅读 · 0 评论 -
第五章 字符串专题 ---------------- 5.5 题解:压缩字符串
题目: 压缩字符串。实现一个算法,利用字符重复出现的次数,实现基本的字符串压缩功能。比如,测试样例"aabcccccaaa" 返回:"a2b1c5a3"。若压缩后的字符串没有变短,则返回原先的字符串。代码:public class Zipper { public static void main(String[] args) { Strin...原创 2019-03-18 09:58:22 · 231 阅读 · 0 评论 -
第五章 字符串专题 ---------------- 5.4 实践:替换字符串中的空格
题目:替换字符串中的空格。请编写一个方法,将字符串中的空格全部替换为“%20”,给定一个String iniString 为原始的串,以及串的长度 int len, 返回替换后的string。/** *测试样例: "Mr John Smith",13 返回:"Mr%20John%20Smith" "Hello World",12 返回:”Hello%20%20World”...转载 2019-03-18 09:56:07 · 126 阅读 · 0 评论 -
第三章:查找与排序(下)----------- 3.29 题解:判断数组的包含问题
判断数组的包含问题:输入两个字符串str1和str2,请判断str1中的所有字符是否都存在于str2。#include<iostream>using namespace std;bool check(string s1,string s2){ for(int i=0;i<s1.length();i++) { char a=s1[i]; if...原创 2019-03-12 21:28:35 · 161 阅读 · 0 评论 -
第五章 字符串专题 ---------------- 5.3 走出思维误区:变形词问题
题目:给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。代码:import java.util.Arrays;/*变形词:两个串有相同的字符及数量组成 abc abc ,abc cba,aabcd bcada;给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。 * 这里规定大小写为不同字符,且考虑...转载 2019-03-17 17:33:00 · 158 阅读 · 0 评论 -
第五章 字符串专题 ---------------- 5.2 题解:巧妙翻转字符串
题目:请实现一个算法,翻转一个给定的字符串。代码:public class ReverseString { /** * 解法一 */ public static String reverseString(String iniString){ int len = iniString.length(); char[...转载 2019-03-17 17:28:51 · 149 阅读 · 0 评论 -
第五章 字符串专题 ---------------- 5.1 题解:判断字符串有无重复字符
题目一:实现一个算法,确定一个字符串的所有字符是否全都不同(有没有重复字符)。public class Different { static boolean checkDifferent(String iniString){ if (iniString.isEmpty()) { return true; } ...转载 2019-03-17 17:25:54 · 184 阅读 · 0 评论 -
第四章:多维数组和矩阵 ------------- 4.8 子矩阵的最大累加和
题目:给定一个矩阵matrix,其中的值有正、有负、有0,返回子矩阵的最大累加和。例如,matrix为:-1 -1 -1-1 2 2-1 -1 -1其中最大累加的子矩阵为:2 2,所以返回 4思路:解法一:暴力破解,查找出所有的子矩阵,时间复杂度太高了,不可取。解法二:假定只有一行,那就跟求最大和子数组一样。 如果限...转载 2019-03-17 16:38:46 · 216 阅读 · 0 评论 -
第四章:多维数组和矩阵 ------------- 4.7 子数组最大累加和
题目: 给定一个数组arr,返回子数组的最大累加和。例如arr = {1,-2,3,5,-2,6,-1};所有的子数组中[3,5,-2,6]可以累加出最大的和12,所以返回12。代码:import java.util.Arrays;import java.util.Date;/** * 求和最大的连续子数组,有可能不唯一,返回一个即可 */public...转载 2019-03-17 15:52:30 · 160 阅读 · 0 评论 -
第四章:多维数组和矩阵 ------------- 4.4 找出边界为1的最大子方阵
找出边界为1的最大子方阵:1、未优化的题解:(复杂度较高)//伪代码max(A,N){ int n=N; while(n>0){ for(i from 0 to N-1){ if(i+n>N) break; l3: for(j from 0 to N-1){ if(j+n>N) break; //i,...原创 2019-03-17 15:25:23 · 381 阅读 · 0 评论 -
第四章:多维数组和矩阵 ------------- 4.3 基础题:Z形打印二位数组
Z形打印二位数组:思路:打印斜线。注意更换方向的条件。代码:#include<iostream>#include<vector> using namespace std;void print(vector<vector<int> > matrix){ //r:行号, m:行数 int r=0,m=ma...原创 2019-03-16 22:36:44 · 187 阅读 · 0 评论 -
第六章 数学问题 -------- 6.7【扩展欧几里得】一步之遥
题目:一步之遥从昏迷中醒来,小明发现自己被关在X星球的废矿车里。矿车停在平直的废弃的轨道上。他的面前是两个按钮,分别写着“F”和“B”。小明突然记起来,这两个按钮可以控制矿车在轨道上前进和后退。按F,会前进97米。按B会后退127米。透过昏暗的灯光,小明看到自己前方1米远正好有个监控探头。他必须设法使得矿车正好停在摄像头的下方,才有机会争取同伴的援助。或许,通过多...转载 2019-03-22 00:04:12 · 208 阅读 · 0 评论 -
第六章 数学问题 -------- 6.9 天平称重问题【线性同余方程】青蛙的约会
模运算: 取模:计算除以m的余数,叫做对m取模 同余:将a,b对m取模的结果相同,记为a≡b(modm)(例如:x % 3 = 2 ===> x ≡ 2(%3),x余3等于2,和2同余),即 a mod m == b mod m 如果 a≡b(modm),且c≡d(modm),则有a+b≡c+d(modm) a*b≡c*d(mo...转载 2019-03-22 00:06:47 · 628 阅读 · 0 评论 -
第五章 字符串专题 ---------------- 字符串匹配(三)----后缀数组算法
一、什么是后缀数组: 字符串后缀Suffix指的是从字符串的某个位置开始到其末尾的字符串子串。后缀数组 Suffix Array(sa)指的是将某个字符串的所有后缀按字典序排序之后得到的数组,不过数组中不直接保存所有的后缀子串,只要记录后缀的起始下标就好了。 比如下面在下面这张图中,sa[8] = 7,表示在字典序中排第9的是起始下标为7的后缀子串,这里还有一个比较重要的数组ran...转载 2019-03-19 00:23:53 · 270 阅读 · 0 评论 -
第五章 字符串专题 ---------------- 字符串匹配(二)----KMP算法
什么是KMP算法: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。先来看...转载 2019-03-19 00:19:01 · 216 阅读 · 0 评论 -
第五章 字符串专题 ---------------- 5.12 字符串匹配之PabinKarp
题目:假如要判断字符串A"ABA"是不是字符串B"ABABABA"的子串。解法一:暴力破解法,直接枚举所有的长度为3的子串,然后依次与A比较,这样就能得出匹配的位置。 这样的时间复杂度是O(M*N),M为B的长度,N为A的长度。解法二: Rabin-Karp算法: 思想:假设待匹配字符串的长度为N,目标字符串的长度为M(M>N);首先计算待匹配...转载 2019-03-19 00:13:16 · 285 阅读 · 0 评论 -
第五章 字符串专题 ---------------- 5.11 题解:最短摘要的生成
题目:Alibaba笔试题,给定一段产品的英文描述,包含M个英文单词,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法。String extractSummary(String description,String[] key words)目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出。(不限编程语言...转载 2019-03-19 00:09:29 · 192 阅读 · 0 评论 -
第五章 字符串专题 ---------------- 5.10 题解:神奇的回文串
一、回文字符串:1、题目:判断一个字符串是否为 回文字符串。思路:判断翻转后,是否与原串相同。2、C++代码:#include <iostream>#include<algorithm>using namespace std; bool isPalindrome(string src){ if(src.empty()) { r...原创 2019-03-19 00:05:31 · 272 阅读 · 0 评论 -
第五章 字符串专题 ---------------- 5.9 题解:去掉字符串中连接出现的k次的0
题目:移除字符串中连续出现的K个0。用count记录连续出现的0的个数N,一旦下一个不是0,输出N%K个0。一、C++代码:#include <iostream>#include<cstring>using namespace std; string remove(string src,int k){ int len=src.leng...原创 2019-03-19 00:03:57 · 186 阅读 · 0 评论 -
第五章 字符串专题 ---------------- 5.8 题解:将字符串中按单词翻转
题目:翻转单词。将字符串按单词翻转,如here you are 翻转成are you here一、利用strtok(字符数组分割函数),和reverse函数:1、C++代码:#include<iostream>#include<algorithm>#include <cstring>using namespace std;stri...原创 2019-03-19 00:02:35 · 213 阅读 · 0 评论 -
第五章 字符串专题 ---------------- 5.7 题解:旋转词
题目:旋转词问题。如果一个字符串str,把字符串str前面任意的部分挪到后面形成的字符串叫做str的旋转词。判断两个字符串是否互为旋转词。C++代码:#include<iostream>#include<algorithm>using namespace std;bool isRotate(string a,string b){ if(a...原创 2019-03-19 00:01:11 · 234 阅读 · 0 评论 -
第五章 字符串专题 ---------------- 5.6 解题:判断两字符串的字符集是否相同
题目:判断两字符串的字符集是否相同。实现一个算法,判断两个字符串是否由相同的字符所组成,不用管重复次数。如"abc","abccc",这两个字符串的字符集相同,都由abc组成,返回true。public class HasSameCharSet { public static void main(String[] args) { System.out.pri...转载 2019-03-18 23:59:53 · 475 阅读 · 0 评论 -
第七章 递归、DFS、剪枝、回溯等问题 ------------- 7.4 硬币表示某个给定数值
一、题目: 假设我们有8种不同面值的硬币{1,5,10,25},用这些硬币组合构成一个给定的数值n。例如n=100,那么一种可能的组合方式为 100 = 2*25+5*5+2*10+5*1。问总共有多少种可能的组合方式?二、思路: 先来看看递归解法,看到这种题目,不要一上来就想着我怎么来划分任务,我怎么把任务交给其他人去做。首先还是由简单到复杂,先列举一些简单的情况,发现规律。...转载 2019-03-22 00:25:30 · 285 阅读 · 0 评论 -
第七章 递归、DFS、剪枝、回溯等问题 ------------- 7.3 题解:机器人走方格问题
机器人走方格一、问题: 有一个X*Y的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。给定两个正整数int x,int y,请返回机器人的走法数目,保证x+y小于等于12。二、思路: 思考这类看起来很复杂的问题,实际上就越有规律可循,我们先列举一些简单的情况,再由简到繁,逐步得出结果,逐步发现规律。就是说先解决简...转载 2019-03-22 00:22:55 · 320 阅读 · 0 评论 -
第六章 数学问题 -------- 6.14 【快速幂】斐波那契数列
快速幂运算: 快速幂的目的就是做到快速求幂,假设我们要求a^b,按照朴素算法就是把a连乘b次,这样一来时间复杂度是O(b)也即是O(n)级别,快速幂能做到O(logn),快了好多好多。它的原理如下: 假设我们要求a^b,那么其实b是可以拆成二进制的,该二进制数第i位的权为2^(i-1),例如当b==11时: a11=a(2^0+2^1+2^3) 11的二进制是1011...转载 2019-03-22 00:20:51 · 236 阅读 · 0 评论 -
第六章 数学问题 ----------6.13 素数的筛法(第十万零二个素数)
素数定理: 给出从整数中抽到素数的概率。从不大于n的自然数随机选一个,它是素数的概率大约是1/ln n。也就是说在不大于n的自然数里,总共的素数为 n/lgn。筛法: 用筛法求素数的基本思想是(本质上也能算是一种预处理):把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结...转载 2019-03-22 00:17:28 · 310 阅读 · 0 评论 -
第六章 数学问题 -------- 6.12 素数及质因数分解
import java.util.HashMap;import java.util.Map; public class PrimeNumber { public static void main(String[] args) { boolean res = isPrime(7); System.out.println(res); ...转载 2019-03-22 00:14:53 · 187 阅读 · 0 评论 -
第六章 数学问题 -------- 6.11【同余方程组】POJ1006 生理周期
同余方程组: 先来看一道题目:有物不知其数,三三数之剩二;五五数之剩三;七七数之剩二。问物几何? 然后我们可以做如下变换,设x为所求的数。 x%3=2 x ≡a1(%m1) ① x%5=3 ===> x ≡a2(%m2) ② x%7=2 x ≡a3(%m3) 根据前面两式可以得到 ...转载 2019-03-22 00:13:39 · 288 阅读 · 0 评论 -
第六章 数学问题 -------- 6.10 特殊的同余方程—逆元
逆元: 同余方程 ax≡1(modn),gcd(a,n) = 1 时有解,这时称求出的 x 为 a 的对模n的乘法逆元。(注意:如果gcd(a,n)如果不等于1则无解),解法还是利用扩展欧几里得算法求解方程 ax + ny = 1 求出 x。/** * 求逆元 * ax = 1 (% mo),gcd(a,mo)=1 * ax+mo*y=1 * ...转载 2019-03-22 00:10:32 · 279 阅读 · 0 评论 -
第三章:查找与排序(下)----------- 3.28 特殊排序(利用sort函数)
特殊排序:输入一个正整数数组,把数组中的所有元素拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如:输入数组{3,32,321},则这3个数字能拼接成的最小数字为:321323利用sort()函数。代码:#include<iostream>#include<algorithm>//#include<cstring&g...原创 2019-03-12 12:57:37 · 117 阅读 · 0 评论 -
第三章:查找与排序(下)----------- 3.27 用计数排序解决员工年龄问题
用计数排序解决员工年龄问题:计数排序: int age[101]; // 特别注意:0号位不用,长度要设为101,最大下标才能是100。代码:#include<iostream>using namespace std;void countSort(int arr[],int length){ int age[101]; //特别注意...原创 2019-03-12 09:18:12 · 257 阅读 · 0 评论 -
第三章:查找与排序(下)------------- 3.8题解_调整数组顺序-奇数在左偶数在右
调整数组顺序-奇数在左偶数在右:法一:模式匹配:归并排序:奇数放左边,偶数放右边。需另外开辟空间。#include<iostream>using namespace std; void mergeSortOddEven(int arr[],int low, int high){ int length=high-low+1; int ref[length...原创 2019-03-09 15:37:21 · 208 阅读 · 0 评论 -
第二章 :查找与排序-------2.15 分析10种排序算法的稳定性
10种排序算法的稳定性:原创 2019-03-06 22:09:07 · 311 阅读 · 0 评论 -
第二章 :查找与排序-------2.13_三种典型递归形式算法的性能分析
三种典型递归形式算法的性能分析:1、求n的阶乘:int f(int n){ if(n==1){ return 1; } return n*f(n-1);} ①、子问题的规模下降②、处理子问题消耗的时间写出下式:T(n)=T(n-1)+O(1)得出:求阶乘的时间复杂度: N个O(1)=> O(N)。2、打印i到j:void print(in...原创 2019-03-06 21:41:36 · 180 阅读 · 0 评论