内功
算法,数据结构,面试题汇总
Lawrence_121
千里之行,始于足下
展开
-
数组应用【旋转数组】
题目:You are given an nx n2D matrix representing an image.Rotate the image by 90 degrees (clockwise).Follow up:Could you do this in-place分析: 给一个N*N的数组,旋转90度,不可以开辟额外空间 已N=3进行分析: 旋转后变为 ①我们把焦点放在一个元素的旋转上,可以看出要在员数组中旋转,在不丢失数据...原创 2020-07-19 17:46:47 · 718 阅读 · 0 评论 -
数组应用【洗牌问题】
思考:设计一个公平的洗牌算法1. 看问题,洗牌,显然是一个随机算法了。随机算法还不简单?随机呗。把所有牌放到一个数组中,每次取两张牌交换位置,随机 k 次即可。如果你的答案是这样,通常面试官会进一步问一下,k 应该取多少?100?1000?10000?很显然,取一个固定的值不合理。如果数组中有 1000000 个元素,随机 100 次太少;如果数组中只有 10 个元素,随机 10000 次又太多。一个合理的选择是,随机次数和数组中元素大小相关。比如数组有多少个元素,我们就随机多少次。这...转载 2020-07-04 16:55:05 · 1028 阅读 · 0 评论 -
数组应用【计算素数】
题目:给定一个正整数n,计算出小于等于n的质数有多少个?比如17,则返回7,因为小于等于17的质数有2,3,5,7,13,17。分析:1、首先得知道什么是质数?质数又称素数,如果一个大于1的自然数,除了1和它自身外,没法被其他自然数整除,那么这个自然数就是质数。换句话说,只有两个正因数(1和本身)的自然数即为质数。2、那么如何判断一个数是质数呢?思路1: 判断一个整数m是否是质数,只需把 m 被 2 ~ m-1 之间的每一个整数去除,如果都不能被整除,那么 m 就是一...原创 2020-07-04 16:12:58 · 1356 阅读 · 0 评论 -
分巧克力-------二分查找
儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。 小明一共有N块巧克力,其中第i块是Hi Wi的方格组成的长方形。 为了公平起见,小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切出的巧克力需要满足: 1. 形状是正方形,边长是整数 2. 大小相同 例如一块6x5的巧克力可以切出6块2x2的巧克力或者2块3x3的巧克力。...原创 2018-11-05 18:46:36 · 208 阅读 · 0 评论 -
k倍区间
给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。你能求出数列中总共有多少个K倍区间吗?输入-----第一行包含两个整数N和K。(1 <= N, K <= 100000)以下N行每行包含一个整数Ai。(1 <= Ai <= ...原创 2018-06-18 09:49:27 · 174 阅读 · 0 评论 -
Array Partition
描述Given an integer array A1, A2 ... AN, you are asked to split the array into three continuous parts: A1, A2 ... Ap | Ap+1, Ap+2, ... Aq | Aq+1, Aq+2, ... AN.Let S1, S2 and S3 denote the sums of ...原创 2018-06-19 10:27:18 · 403 阅读 · 0 评论 -
N个整数中,在所有大于等于K的两个数的差中,找出最小的差(双指针优化)
先介绍一下暴力枚举,有的时候我们要对一个数组进行i和j的双重循环枚举: 当i=0时,j要从下标1遍历到5。时间复杂度为O(N^2)双指针的思路是什么呢?就是j下标并不需要从i+1开始重新向后枚举一遍,而是随着i向后移动,j也向后移动。 从图中我们可以看到j一直是往右走,不会出现往左移动,当然前提的保证数组是有序的,这样的时间复杂度为O(N)/* 给定N个整数A1,A2....原创 2018-06-12 11:34:21 · 1152 阅读 · 0 评论 -
偶像的条件
/*描述小Hi的学校正面临着废校的大危机。面对学校的危机,小Hi同学们决定从ABC三个班中各挑出一名同学成为偶像。成为偶像团体的条件之一,就是3名团员之间的身高差越小越好。已知ABC三个班同学的身高分别是A1..AN, B1..BM 和 C1..CL。请你从中选出3名同学Ai, Bj, Ck使得D=|Ai-Bj|+|Bj-Ck|+|Ck-Ai|最小。输入第一行包含3个整数,N,...原创 2018-06-17 10:14:47 · 386 阅读 · 0 评论 -
四平方和问题优化:
四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和。如果把0包括进去,就正好可以表示为4个数的平方和。比如:5 = 0^2 + 0^2 + 1^2 + 2^27 = 1^2 + 1^2 + 1^2 + 2^2(^符号表示乘方的意思)对于一个给定的正整数,可能存在多种平方和的表示法。要求你对4个数排序:0 <= a <= b <=...原创 2018-06-08 11:03:10 · 596 阅读 · 0 评论 -
小Hi和小Ho的礼物
/* 描述 某人有N袋金币,其中第i袋内金币的数量是Ai。现在他决定选出2袋金币送给小Hi,再选2袋金币送给小Ho,同时使得小Hi和小Ho得到的金币总数相等。 他想知道一共有多少种不同的选择方法。 具体来说,有多少种下标四元组(i, j, p, q)满足i, j, p, q两两不同,并且i < j, p < q, Ai + Aj = Ap + Aq。 ...原创 2018-06-08 17:03:57 · 921 阅读 · 0 评论 -
在n个元素的数组中,找到差值为k的数字对去重后的个数
/* 在n个元素的数组中,找到差值为k的数字对去重后的个数 思路: 双重循环枚举对,然后把一对数放在set容器去重,最后输出set的大小 缺点: 当数据很大时,时间复杂度会很高*/#include <iostream>#include <set>using namespace std;set <pair<i...原创 2018-06-06 20:58:28 · 840 阅读 · 1 评论 -
一面砖墙
/*小Hi的学校的教学楼前有一面砖墙。这面墙由N层砖砌成,其中从上到下第i层包含Ci块高度相同但宽度不同的砖。例如下图所示的这面墙,由3层砖砌成。其中第1层包含3块砖,从左到右宽度依次是6、4和3;第2层包含4块砖,从左到右依次宽度依次是4、4、2和3;第3层包含3块砖,从左到右宽度依次是5、6和2。+------------+| 6 | 4 |3 |+------------+...原创 2018-06-06 21:17:26 · 968 阅读 · 0 评论 -
平方十位数
/* 标题:平方十位数 由0~9这10个数字不重复、不遗漏,可以组成很多10位数字。 这其中也有很多恰好是平方数(是某个数的平方)。 比如:1026753849,就是其中最小的一个平方数。 请你找出其中最大的一个平方数是多少? 思路1: 1.枚举答案 X[9876543210,1026753849] 2.判断是不是恰好0-9十个数字 ...原创 2018-06-04 19:55:02 · 1174 阅读 · 0 评论 -
TCP协议详解
TCP的主要特点:TCP是面向连接的运输层协议。也就是说应用程序在传送数据前,必须建立连接。 每一条TCP连接只能有两个端点,即(一对一),每个端点由二元组(IP,端口号)唯一标识。注(IP,端口号)也叫socket TCP提供全双工通信。 TCP提供可靠交付的服务。TCP连接传送的数据无差错,不丢失,不重复,并且按序到达。 面向字节流。TCP中的“流”指的是流入到进程或从进程流出的字...原创 2018-05-07 21:20:11 · 324 阅读 · 0 评论 -
蓝桥杯之明码问题(bitset)
标题:明码汉字的字形存在于字库中,即便在今天,16点阵的字库也仍然使用广泛。16点阵的字库把每个汉字看成是16x16个像素信息。并把这些信息记录在字节中。一个字节可以存储8位信息,用32个字节就可以存一个汉字的字形了。把每个字节转为2进制表示,1表示墨迹,0表示底色。每行2个字节,一共16行,布局是: 第1字节,第2字节 第3字节,第4字节 .... 第31字节, 第32字...转载 2018-04-14 20:32:44 · 1361 阅读 · 0 评论 -
k倍区间 (抽屉原理)
转自:https://www.cnblogs.com/tyty-Somnuspoppy/p/8454521.html给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。 你能求出数列中总共有多少个K倍区间吗? 输入-----第一行包含两个整数N和K。(1 &l...转载 2018-04-23 06:58:59 · 403 阅读 · 0 评论 -
安迪的第一个字典(set容器)
问题: 输入一个文本,找出所有不同的单词(连续的字母序列),按字典从小到大输出,单词不分大小写。样例输入:Adventures in DisneylandTwo blondes were going to Disneyland when they came to a fork in theroad. The sign read: "Disneyland Left."So they w...原创 2018-04-08 17:32:55 · 526 阅读 · 0 评论 -
愚蠢的摄像师
背景 "如果两个人相差一秒出生, 其中一个是小孩, 那么另一个也是小孩. 由此可以推论, 所有人均是小孩." 问题 数计系是一个由N个人组成的大家庭, 分别为1, 2, 3, ..., N岁. 有一次系主任想为全系拍张合照. 需要所有学生站成一排. 起先他想按他们的岁数从小到大安排, 但后来又觉得这样不自然. 于是他建议按如下方案站排: 1岁的在最左边. 每相邻两人不得相差超过2岁. 这样学生的岁...原创 2018-03-28 16:42:35 · 823 阅读 · 0 评论 -
换位置
M个人围成一圈,每分钟相邻的两个人可以交换位置(只能有一对交换)。求使M个人的顺序颠倒(即每个人左边相邻的人换到右边,右边相邻的人换到左边)所需的最少时间(分钟数)。 输入 第一行为测试数据的组数n,以后n行中每行为一个小于32767的正整数,表示M ...原创 2018-03-28 17:24:40 · 1395 阅读 · 0 评论 -
连通性问题
给定一个方阵,定义连通:上下左右相邻,并且值相同。可以想象成一张地图,不同的区域被涂以不同颜色。输入:整数N, (N<50)表示矩阵的行列数接下来N行,每行N个字符,代表方阵中的元素接下来一个整数M,(M<1000)表示询问数接下来M行,每行代表一个询问,格式为4个整数,y1,x1,y2,x2,表示(第y1行,第x1列) 与 (第y2行,第x2列) 是否连通。连通输出true,否则fa...原创 2018-03-28 16:02:33 · 558 阅读 · 0 评论 -
二分查找
已知有序的序列,比如:2,3,3,5,9,9,9,12,12,13,15,22,22,22,22,25,25,23,91,95有整数x,比如: x=23要求找到一个刚好比x稍微大一点的元素位置当数组较大的时候,二分查找可加快速度。思路:进行分区#include<iostream>using namespace std;//重载 含begin,不含end 半开区间, 例如:[1...原创 2018-03-24 16:42:55 · 188 阅读 · 0 评论 -
大数的乘法
用串的形式表示大数的乘法。即求类似: "23234845847839461464158174814792" * "6457847285617487843234535"要求结果返回一个串。思路: 对于大整数的乘法,我们可以利用分治法将其两个字符串从中间截断,将两字符串的后半部分,进行相乘,记得进位。对于前半部分相乘,前半部分记得补0,然后将两个数相加。#include<st...原创 2018-03-25 20:23:26 · 285 阅读 · 0 评论 -
环形格子涂色
如图,组成环形的格子需要涂3种颜色。它们的编号分别是1~14相邻的格子不能用相同的颜色。涂色方案的数目是:16386当格子数目为50的时候,求涂色方案总数。思路: 可以将这个环从1和14之间剪开14.... 21分两种情况:当2和14颜色相同时,1这个位置有2种填法当2和14颜色不相同时,1这个位置有 1种填法 #include<stdio.h>int main()...原创 2018-03-26 20:44:44 · 1485 阅读 · 0 评论 -
excel地址
Excel单元格的地址表示很有趣,它使用字母来表示列号,比如:A表示第1列,B表示第2列,Z表示第26列,AA表示第27列,AB表示第28列,BA表示第53列,....当然Excel的最大列号是有限度的,所以转换起来不难。如果我们想把这种表示法一般化,可以把很大的数字转换为很长的字母序列呢?本题目既是要求对输入的数字, 输出其对应的Excel地址表示方式。例如,输入:26则程序应该输出:Z再例如,...原创 2018-03-18 22:48:12 · 688 阅读 · 0 评论 -
欧几里得算法及其扩展
欧几里得算法: 欧几里得算法又称辗转相除法,是指计算两个正整数a,b的最大公约数。 计算公式: gcd(a,b)=gcd(b,a%b);欧几里得算法扩展: 扩展欧几里得算法是欧几里得算法的推广,利用欧几里得算法的思想和递归求得贝祖等式a*x+b*y=gcd(a,b)不定方程中的一组x和y的解。 原理: 当b=0时,很显然a*x=gcd(a,b)=a,所以x=1,而y为任意数,为...原创 2018-03-16 23:01:26 · 269 阅读 · 0 评论 -
尼姆堆----取球游戏
尼姆游戏是一种两个人玩的回合制数学战略游戏。游戏者轮流从一堆棋子中取走一个或者多个,最后不能再取的就是输家。当指定相应数量时,一堆这样的棋子称作一个尼姆堆。问题一:取球博弈 今盒子里有n个小球,A、B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断。 我们约定: 每个人从盒子中取出的球的数目必须是:1...原创 2018-03-18 21:19:14 · 2113 阅读 · 0 评论 -
高僧斗法----核心尼姆堆
古时丧葬活动中经常请高僧做法事。仪式结束后,有时会有“高僧斗法”的趣味节目,以舒缓压抑的气氛。 节目大略步骤为:先用粮食(一般是稻米)在地上“画”出若干级台阶(表示N级浮屠)。又有若干小和尚随机地“站”在某个台阶上。最高一级台阶必须站人,其它任意。(如图所示)两位参加斗法的法师分别指挥某个小和尚向上走任意多级的台阶,但会被站在高级台阶上的小和尚阻挡,不能越过。两个小和尚也不能站在同一台阶,也...原创 2018-03-21 21:23:30 · 435 阅读 · 0 评论 -
暴力破解练习(一)信用卡号的验证
当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。该校验的过程:1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。3、将奇数位总和加上偶数位总和,结果应该可以被10整除。例如,卡号是:...原创 2018-03-10 23:20:31 · 3262 阅读 · 0 评论 -
暴力破解练习(二)罗马数字
古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来简直不能忍受,所以在现代很少使用了。之所以这样,不是因为发明表示法的人的智力的问题,而是因为一个宗教的原因,当时的宗教禁止在数字中出现0的概念!罗马数字的表示主要依赖以下几个基本符号:I --> 1V --> 5X --> 10L --> 50C --> 100D --&g...原创 2018-03-11 16:11:21 · 337 阅读 · 0 评论 -
暴力破解练习(三)分巧克力
儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。 小明一共有N块巧克力,其中第i块是Hi Wi的方格组成的长方形。 为了公平起见,小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切出的巧克力需要满足: 1. 形状是正方形,边长是整数 2. 大小相同 例如一块6x5的巧克力可以切出6块2x2的巧克力或者2块3x3的巧克力。当然小朋友们都希...原创 2018-03-11 23:05:23 · 269 阅读 · 0 评论 -
暴力破解练习(四)排列组合模板一
问题 1.已知不同字母构成的串,求它的全排列#include<iostream>#include<string>using namespace std;void f(char *a, int k){ if (k == strlen(a) - 1) { //将字符数组转换为字符串 string b; b = a; cout << ...原创 2018-03-12 20:41:22 · 623 阅读 · 0 评论 -
暴力破解练习(五)排列组合模板二
X星球要派出一个5人组成的观察团前往W星。其中:A国最多可以派出4人。B国最多可以派出2人。C国最多可以派出2人。D国最多可以派出1人。E国最多可以派出1人。F国最多可以派出3人。那么最终派往W星的观察团会有多少种国别的不同组合呢?#include<stdio.h>#include<stdlib.h>#include<string.h>//a:可取最大个...原创 2018-03-13 20:02:28 · 363 阅读 · 0 评论 -
暴力破解练习(六)四平方和
四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和。如果把0包括进去,就正好可以表示为4个数的平方和。比如:5 = 0^2 + 0^2 + 1^2 + 2^27 = 1^2 + 1^2 + 1^2 + 2^2(^符号表示乘方的意思)对于一个给定的正整数,可能存在多种平方和的表示法。要求你对4个数排序:0 <= a <= b <= c <= d并对...原创 2018-03-28 20:37:52 · 606 阅读 · 0 评论 -
暴力破解练习(七)交换瓶子
有N个瓶子,编号 1 ~ N,放在架子上。比如有5个瓶子:2 1 3 5 4要求每次拿起2个瓶子,交换它们的位置。经过若干次后,使得瓶子的序号为:1 2 3 4 5对于这么简单的情况,显然,至少需要交换2次就可以复位。如果瓶子更多呢?你可以通过编程来解决。输入格式为两行:第一行: 一个正整数N(N<10000), 表示瓶子的数目第二行:N个正整数,用空格分开,表示瓶子目前的排列情况。输出数据...原创 2018-03-29 19:36:07 · 519 阅读 · 0 评论 -
重点掌握-----快速排序
快速排序是冒泡排序的改进版,也是最好的一种内排序,在很多面试题中都会出现,也是作为程序员必须掌握的一种排序方法。思想: 1.在待排序的元素任取一个元素作为基准(通常选第一个元素,但最的选择方法是从待排序元素中随机选取一个作为基准),称为基准元素; 2.将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边; 3.对左右两个分区...原创 2018-03-29 15:10:12 · 579 阅读 · 0 评论 -
蓝桥杯之煤球数目
煤球数目有一堆煤球,堆成三角棱锥形。具体:第一层放1个,第二层3个(排列成三角形),第三层6个(排列成三角形),第四层10个(排列成三角形),....如果一共有100层,共有多少个煤球?思路: 1 2 3 4 5 6 ......n 这是一个等差数列的前n项和 补充: 等差数列是常见数列的一种,可以用A、P表示,如果一个数列从第二项起转载 2017-10-30 15:59:35 · 892 阅读 · 0 评论 -
面试题之斐波那契数列
简介: 斐波那契数列是意大利著名的数学家,他最重要的研究成果是在不定分析和数学论方面,他的斐波那契数列成为世人热衷研究的问题。*:面试此题的几率也很大。特点: a1,a2已知 a(n)=a(n-1)+a(n-2) n>=3应用: 兔子繁殖问题,树枝问题,上楼方式问题,蜂房问题,声音问题,花瓣问题。。。。。详解:原创 2017-11-01 09:31:15 · 712 阅读 · 2 评论 -
递归之振兴中华
小明参加了学校的趣味运动会,其中的一个项目是:跳格子。地上画着一些格子,每个格子里写一个字,如下所示:(也可参见下图)从我做起振我做起振兴做起振兴中起振兴中华比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。要求跳过的路线刚好构成“从我做起振兴中华”这句话。请你帮助小明算一算他一共有多少种可能的跳跃路线呢? ...原创 2018-03-14 15:09:49 · 309 阅读 · 0 评论 -
递归之找钱问题
公园票价为5角。假设每位游客只持有两种币值的货币:5角、1元。再假设持有5角的有m人,持有1元的有n人。由于特殊情况,开始的时候,售票员没有零钱可找。我们想知道这m+n名游客以什么样的顺序购票则可以顺利完成购票过程。显然,m < n的时候,无论如何都不能完成;m>=n的时候,有些情况也不行。比如,第一个购票的乘客就持有1元。请计算出这m+n名游客所有可能顺利完成购票的不同情况的组合数目...原创 2018-03-14 15:31:46 · 309 阅读 · 0 评论 -
递归之出栈次序
X星球特别讲究秩序,所有道路都是单行线。一个甲壳虫车队,共16辆车,按照编号先后发车,夹在其它车流中,缓缓前行。路边有个死胡同,只能容一辆车通过,是临时的检查站,如图所示。X星球太死板,要求每辆路过的车必须进入检查站,也可能不检查就放行,也可能仔细检查。如果车辆进入检查站和离开的次序可以任意交错。那么,该车队再次上路后,可能的次序有多少种?为了方便起见,假设检查站可容纳任意数量的汽车。显然,如果车...原创 2018-03-14 15:44:48 · 503 阅读 · 0 评论