牛客网《BAT面试算法精品课》学习笔记

牛客网《BAT面试算法精品课》笔记一:排序

排序的详细实现:博客

微信公众号

牛客网《BAT面试算法精品课》笔记二:字符串

字符串Case:

Case1.
判断T2二叉树是否包含了T1
普通解法为二叉树遍历+匹配问题,考察t1中每个节点为头的子树是否与t2一致,时间复杂度为O(N*M),N代表t1节点数,M代表t2节点数。
但是这道题的最优解为O(M+N),将t1序列化为字符串str1,t2序列化为字符串str2,用KMP算法判断str1中是否含有str2

Case2.
给定两个字符串str1和str2,如果str1和str2中出现的字符种类一样且每种字符出现的次数也一样,那么str1与str2互为变形词,请实现函数判断两个字符是否互为变形词。
举例:
Str1=“123”,str2=“231”,返回true
Str1=“123”,str2=“2331”,返回false
可以使用哈希表做字符计数,两个 str生成两个哈希表,比较两个表的记录是否一致。也可以用固定长度的数组代替哈希表结构。

Case3.
给定一个字符串str,把字符串str前面任意的部分挪到后面去形成的字符串叫做str的旋转词。比如str=“1234”,str的旋转词有:“1234”,“2341”,“3412”,“4123”,给定两个字符串a和b,请判断a和b是否互为旋转词。
举例:
a=”cdab”,b=”abcd”,返回true
a=”1ab2”,b=”ab12”,返回false
本题最优解时间复杂度O(N)
首先判断str1与str2是否长度相等,如果长度相等,生成str1+str2的大字符串,用KMP算法判断大字符串中是否含有str2
举例说明:
str1=“1 2 3 4”
str1+str1=”1 2 3 4 1 2 3 4”
1234,2341,3412,4123都是它的旋转词

Case4.
给定一个字符串,请在单词间做逆序调整
举例:
“pig loves dog”逆序为“dog loves pig”
先写一个让所有字符逆序的函数f,用函数f将句子整体的字符逆序:“pig loves dog”变为“god sevol gip”,然后用f将每一个单词逆序,最后得到“dog loves pig”

Case5.
给定一个字符串str,和一个整数i,i代表str中的位置,将str[0..i]移到右侧,str[i+1..N-1]移到左侧
举例:
str=“ABCDE“,I=2,将str调整为”DEABC“
要求时间复杂度O(N),额外空间复杂度O(1)
因为有空间复杂度要求,所以不能开辟新数组,之能在原数组基础上操作。首先将str[0..i]部分的字符逆序ABCDE:CBADE,再将str[i+1..N-1]部分的字符逆序,CBADE:CBAED,最后将整个的字符逆序,CBAED:DEABC

Case6.
给定一个字符串类型的数组strs,请找到一种拼接顺序,使得所有的字符串拼接起来组成的大字符串是所有可能性中字典顺序最小的,并返回这个大字符串。
举例:
Strs=[“abc”,”de”],可以拼成“abcde“,也可以拼成”deabc“,但前者字典顺序更小,所以返回”abcde“
Strs=[“b”,”ba”],可以拼成“bba“,也可以拼成”bab“,但后者字典顺序更小,所以返回”bab“。
最优解的时间复杂度O(N*logN)
错误方案:根据单独每个字符串的字典顺序排序
正确方案:如果str1+str2<str2+str1,则str1放在前面,否则str2放在前面

Case7.
给定一个字符串str,将其中所有空格字符替换成“%20“,假设str后面有足够的空间。
Str=”a b c”
遍历str,发现空格数为2,所以在str替换后,长度为5+2*2=9
然后从后开始遍历str,将c放在第九个位置,结果为a%20b%20c

Case8.
给定一个字符串str,判断是不是整体有效的括号字符串
举例:
Str=”()”,返回true;str=“(()())“,返回true;str=”(())“,返回true;
Str=“())“,返回false;str=”()(“,返回false;str=”()a()“,返回false;
本题时间复杂度O(N),额外空间复杂度O(1)
01.整形变量num,代表’(’出现次数与‘)’出现次数的差值
02.遍历的过程,遇到‘(’,num++,遇到‘)’,num—
03.遍历的过程中如果num<0,则直接返回false
04.如果一直没出现03的情况,则一直遍历下去
05.遍历完成后,如果num==0,则返回true,否则返回false

Case9.
给定一个字符串str,返回str中的最长无重复字符子串的长度
举例:
str=”abcd”,返回4
str=“abcd”,最长无重复子串为“abc”,返回3
本题最优解时间复杂度为O(N),额外空间复杂度O(N).
求出以str中每个字符结尾的情况下,最长无重复字符子串的长度,并在其中找出最大值返回。思路:由于这个题目只要给出最长不重复子串的长度,所以代码比较简单。第一思路就是利用哈希表来进行操作。用字符当做键值,字符在串中的位置当做实值。用pre变量记录字符第一次出现的位置,最大长度max就是利用当前位置减去pre就是当前最大长度了。

牛客网《BAT面试算法精品课》笔记三:队列和栈

牛客网《BAT面试算法精品课》笔记四:链表

牛客网《BAT面试算法精品课》笔记五:二分搜索

牛客网《BAT面试算法精品课》笔记六:二叉树

牛客网《BAT面试算法精品课》笔记七:位运算

牛客网《BAT面试算法精品课》笔记八:排列组合

牛客网《BAT面试算法精品课》笔记九:概率

牛客网《BAT面试算法精品课》笔记十:大数据

牛客网《BAT面试算法精品课》笔记十一:动态规划

牛客网《BAT面试算法精品课》学习笔记的更多相关文章

  1. 腾讯PCG(后台开发) 牛客网视频面试 一面

    腾讯视频面试 作为一个小渣渣记录一下,腾讯是我一直想进的公司,但其实准备的时间不是很长,也不是科班还是存在很大的劣势,记录一下找工作的经历. 首先说一下,这是我第一次视频面试,还是蛮紧张的.不过面试官 ...

  2. 像素反转 牛客网 程序员面试金典 C++ Python

    像素反转 牛客网 程序员面试金典 题目描述 有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度. 给定 ...

  3. 二进制插入 牛客网 程序员面试金典 C++ Python java

    二进制插入 牛客网 程序员面试金典 题目描述 有两个32位整数n和m,请编写算法将m的二进制数位插入到n的二进制的第j到第i位,其中二进制的位数从低位数到高位且以0开始. 给定两个数int n和int ...

  4. 寻找下一个结点 牛客网 程序员面试金典 C++ java Python

    寻找下一个结点 牛客网 程序员面试金典 C++ java Python 题目描述 请设计一个算法,寻找二叉树中指定结点的下一个结点(即中序遍历的后继). 给定树的根结点指针TreeNode* root ...

  5. 原串反转 牛客网 程序员面试金典 C++ Python

    原串反转 牛客网 程序员面试金典 C++ Python 题目描述 请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量). 给定一个string iniS ...

  6. 高度最小的BST 牛客网 程序员面试金典 C++ Python

    高度最小的BST 牛客网 程序员面试金典 C++ Python 题目描述 对于一个元素各不相同且按升序排列的有序序列,请编写一个算法,创建一棵高度最小的二叉查找树. 给定一个有序序列int[] val ...

  7. 输出单层结点 牛客网 程序员面试金典 C++ Python

    输出单层结点 牛客网 程序员面试金典 C++ Python 题目描述 对于一棵二叉树,请设计一个算法,创建含有某一深度上所有结点的链表. 给定二叉树的根结点指针TreeNode* root,以及链表上 ...

  8. 访问单个结点的删除 牛客网 程序员面试金典 C++ Python

    访问单个结点的删除 牛客网 程序员面试金典 C++ Python 题目描述 实现一个算法,删除单向链表中间的某个结点,假定你只能访问该结点. 给定待删除的节点,请执行删除操作,若该节点为尾节点,返回f ...

  9. 翻转子串 牛客网 程序员面试金典 C++ Python

    反转子串 牛客网 程序员面试金典 C++ Python 题目描述 假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串.请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查 ...

随机推荐

  1. .NET Core使用微软官方类库实现汉字转拼音

    一.NuGet包 拼音:Install-Package SimplifiedChinesePinYinConversion 简体-繁体互转:Install-Package TraditionalChi ...

  2. nginx php 配置跨域

    我使用的是lnmp一键安装包 在虚拟记住添加 add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allo ...

  3. 《javascript语言精粹》读书笔记 Item1 精华与语法

    第一章 精华 任何语言都有其精华的部分和鸡肋的部分,javascript也不例外,而且鸡肋的部分还很多.但javascript的流行却不受他的质量影响. javascript为何如此流行?因为他是we ...

  4. 19.最省钱的app发短信方法

    在创业团队中,一个重要的原则是能省就省,该花就花,把银子用在刀刃上. 现在的app,为了获取用户的社交关系,需要用户的手机号注册.用手机号注册就涉及到一个发送短信验证码的问题,那怎么才能在短信服务上投 ...

  5. 使用jekyll和Github搭建个人博客

    一.使用jekyll和Github三步搭建个人博客 在 Github 上建一个库,库的名字是xxx.github.com,其中的xxx是你的github的账号名(图中标注的不要勾选) 注:如果没有Gi ...

  6. 通过pycharm的Database设置进行数据库的可视化

    pycharm是一个很好的IDE,它还有一个功能直接通过这个IDE连接数据库,然后对数据库进行相关的操作,这样我们可以不用navicat for mysql这样的可视化工具了.   输入账号密码数据库 ...

  7. PACKAGE-INFO.JAVA 作用及用法详解

    转自http://strong-life-126-com.iteye.com/blog/806246 及http://blog.sina.com.cn/s/blog_93dc666c0101gzlr. ...

  8. BZOJ_2124_等差子序列_线段树+Hash

    BZOJ_2124_等差子序列_线段树+Hash Description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pL ...

  9. 使用FileUpload实现Servlet的文件上传

    简介 FileUpload 是 Apache commons下面的一个子项目,用来实现Java环境下的文件上传功能. FileUpload链接 FileUpload 是基于Apache的Commons ...

  10. Centos 7 Linux系统修改网卡名称为ethx

    一.Centos7 系统安装完成后更改网卡名称方法 1.查看Centos7系统默认的网卡配置(eno16777736) [root@server ~]# ifconfig eno16777736: f ...