【校招VIP】前端算法考察之字符串

考点介绍

说到字符串算法我们最先想到的就是模式匹配问题,所谓模式匹配就是字符串匹配问题,就是在一个长的主串中寻找子串的过程,如果我们直接暴力匹配那就是最基本的BF算法;KMP算法与BF算法最大的区别区别就是主串不进行回溯。

前端算法考察之字符串-相关题目及解析内容可点击文章末尾链接查看!

一、考点题目

1.下面哪个流类属于面向字符的输入流( )

A.BufferedWriter

B.FileInputStream

C.ObjectInputStream

D. InputStreamReader

正确答案是 D Java的IO操作中有面向字节(Byte)和面向字符(Character)两种方式。面向字节的操作为以8位为单位对二进制的数据进行操作,对数据不进行转换,这些类都是InputStream和OutputStream的子类。面向字符的操作为以字符为单位对数据进行操作,在读的时候将二进制数据转为字符,在写的时候将字符转为二进制数据,这些类都是Reader和Writer的子类......

2.怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串?
解答:代码如下所示: String s1 = "你好";

String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1")......

3.请实现javascript中的indexOf功能,判断一个字符串a中是否包含另一个字符串b。
解答:a)如果包含,需要返回匹配字符串b的位置;b)如果不包含,需要返回-1

例如 indexOf("hello","el") returns 1;

|-------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | function indexOf(strA, strB) { ``var lenA = strA.length, ``lenB = strB.length; ``if (lenA < lenB) { ``return -1; ``} ``else if (lenA == lenB) { ``return 0; ``} ``else { ``for (``var j = 0; j < lenA; j++) { ``if (strA.charAt(j) == strB[0] && strA.substr(j, lenB) == strB) { ``return j; ``} ``} ``return -1; ``} } console.log(indexOf(``"hello"``, ``"el"``)); ``//1 |

4.给定两个树,判断树2是否为树1的子树,是则返回true
解答:把一棵树序列化为字符串(字符数组) 如果str2是str1的子串 则T2也是T1的子树。

java参考代码如下:

|-------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | package zuoshen1; public class KMP_T1SubtreeEqualsT2 { public static class TreeNode{ int val; TreeNode left; TreeNode right; public TreeNode(int val){ this``.val=val; this``.left=``null``; this``.right=``null``; } } public static String preorder(TreeNode root){ StringBuilder sb=``new StringBuilder(); precore(root,sb); return sb.toString(); } public static void precore(TreeNode root,StringBuilder sb){ if``(root==``null``) return``; sb.append(root.val); sb.append(``"#"``); if``(root.left!=``null``){ precore(root.left,sb); } if``(root.right!=``null``) precore(root.right,sb); ...... |

5.给定一个字符串,如何加最短的字符(只能在原始串的后面进行添加)使其构成一个长的字符串且包含两个原始字符串。
解答:其实就是最大前后缀长度数组~ e.g. abcabc ---->abcabcabc 最少增加3个

多求一位nextArr 可以看出之前4个复用 所以再添一位就好~

总结: 在KMP中nextArr数组基础上 多求一位终止位 将不是的补上即可

|----------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package zuoshen1; public class KMP_ShortestHaveTwice { public static String answer(String str){ if``(str==``null``) ``return null``; char[] s=str.toCharArray(); if``(str.length()==1) return str+str; if``(str.length()==2) return s[0]==s[1]?str+String.valueOf(s[0]):str+str; int cn=getNext(s); return str+str.substring(cn); } public static int getNext(char[] match){ if``(match==``null``||match.length<2){ return -1; } ...... |

二、考点文章

1.【校招VIP】字符串算法合集

说到字符串算法我们最先想到的就是模式匹配问题,所谓模式匹配就是字符串匹配问题,就是在一个长的主串中寻找子串的过程,如果我们直接暴力匹配那就是最基本的BF算法,也就是从主串的第一个字符和子串的第一个字符匹配,如果配对成功二者都继续比较后继的字符,否则子串从头开始,主串从第二个字符开始,一步步重复上述过程,直到配对成功或者到主串尾结束,这种算法有点靠天的感觉,如果运气好了,每一次主串和子串不匹配的时候都是第一个字符就不匹配,那么时间复杂度就是O(n+m),那还可以,但如果运气不好的话,每次主串和子串不成功的匹配都发生在子串T的最后一个字符的位置如主串S为"aaaaaaaaab"子串T为"aaab"这样时间复杂度就变成了O(n*m),那就非常不友好了......

2.【校招VIP】前端算法精选-字符串系列

很多前端工程师甚至很多研发工程师都缺乏数据结构和算知识,前端算法精选系列是一个针对常见的、高频的算法题做的一个算法解析系列,文章会给出详细的思路和解答,希望可以帮助到你。

三、考点视频

前端校招的特点、考点和职业发展

前端是IT校招中目前性价比最高的职位,对所学专业要求不高,考点难度较小,且需求量大。校招时分为一二线公司和普通公司,所对应的校招要求、工资和职业发展都是有差别的......

前端算法考察之字符串-相关题目及解析内容可点击下方链接查看:
前端算法考察之字符串-移动端链接
前端算法考察之字符串-PC端链接

相关推荐
jiayong236 分钟前
第 25 课:给学习笔记页加上搜索、标签筛选和 URL 同步
开发语言·前端·javascript·vue.js·学习
UXbot11 分钟前
如何用 AI 快速生成完整的移动端 UI 界面:从描述到交付的实操教程
前端·ui·交互·ai编程·原型模式
俺不要写代码11 分钟前
lambda表达式理解
c++·算法
南囝coding14 分钟前
零成本打造专业域名邮箱:Cloudflare + Gmail 终极配置保姆级全攻略
前端·后端
澈20715 分钟前
动态内存管理:从基础到实战详解
c++·算法
jiayong2318 分钟前
第 12 课:`watch` 和防抖到底该怎么用
前端·javascript·vue.js
想唱rap20 分钟前
C++11之包装器
服务器·开发语言·c++·算法·ubuntu
鹏程十八少27 分钟前
2.2026金三银四 Android Handler 完全指南:28道高频面试题 + 源码解析 + 图解 (一文通关)
android·前端·面试
大连好光景29 分钟前
Fiddler、Wireshark、Charles三种抓包工具的对比
前端·fiddler·wireshark
gyx_这个杀手不太冷静30 分钟前
大人工智能时代下前端界面全新开发模式的思考(五)
前端·架构·ai编程