牛客网《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. Web3与智能合约交互实战

    写在前面 在最初学习以太坊的时候,很多人都是自己创建以太坊节点后,使用geth与之交互.这种使用命令行交互的方法虽然让很多程序员感到兴奋(黑客帝国的既视感?),但不可能指望普通用户通过命令行使用Dap ...

  2. Pat1108: Finding Average

    1108. Finding Average (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The b ...

  3. Alibaba(阿里) RocketMQ入门实例

    摘自:码友18年(www.mayou18.com) what is rocketMQ? RocketMQ作为一款分布式的消息中间件(阿里的说法是不遵循任何规范的,所以不能完全用JMS的那一套东西来看它 ...

  4. SSM-MyBatis-05:Mybatis中别名,sql片段和模糊查询加getMapper

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 简单概述一下本讲 别名,sql片段简单写一下,模糊查询多写一点 一.别名 <typeAliases> ...

  5. Spring Security 实战:QQ登录实现

    准备工作 1.在 QQ互联 申请成为开发者,并创建应用,得到APP ID 和 APP Key.2.了解QQ登录时的 网站应用接入流程.(必须看完看懂) 为了方便各位测试,直接把我自己申请的贡献出来:A ...

  6. Day1----Python学习之路笔记(1)

    学习路线 Day1 Day2 Day3 Day4 Day5 ...待续 一.了解开发语言 1.高级语言:Python,Java,C++,C#,PHP,JS,Go,Ruby,SQL,Swift,Perl ...

  7. linux下设置phantomjs环境变量

    1)vim /etc/profile2)在文件的最后一行,添加安装路径path语句:(注意路径是phantomjs的安装路径)export PATH=${PATH}:/usr/local/src/ph ...

  8. 终于将 SQL Server 成功迁移至 MySQL8.0 啦!!!

    之前一直使用 SQL Server 作为主数据库而不是 MySQL ,原因之一是单机 SQL Server 性能比 MySQL 强很多,另一个原因是之前客户的系统管理员大多只有 SQL Server ...

  9. Java基础-工厂设计模式(三锅的肥鸡)

    ---恢复内容开始---   1)还没有工厂时代:假如还没有工业革命,如果一个你要一架飞机,一般的做法是自己去建造一架飞机,然后拿来开 通常的结果就是 有些时候 要么专科螺钉 没打好  要么就是 那个 ...

  10. visual studio2015中开发python

    之前下载了visual studio2017但是发现很不好用,不如使用matlab与visual studio混合编程就根本找不到visual studio,只有下了visual studio2015 ...