前端开发面试题(应届生)-- js基础算法题
前言
本文汇集了js的一些基础算法题,很多互联网公司在招聘初级前端开发工程师(应届生)时,都喜欢让应聘者做一些js算法题,这时,若你学会了这些js基础算法题的解题思想对你很有帮助,有一些甚至可以直接套用,所以,建议应届生面试前务必看一遍。
题目
题目1:翻转字符串。
解题思路:1、split()字符串转成数组;2、reverse()翻转数组;3、join()数组转化成字符串。
function reverseString(str){
var str=str.split("").reverse().join(""); //字符串转成数组.翻转数组.数组转成字符串
return str; //返回值
}
alert(reverseString("hello world!")); //输出结果:!dlrow olleh
题目2:阶乘。
方法一:while方法
function factorialWhile(num){
var result=1;
while(num){
result*=num;
num--;
}
return result;
}
alert(factorialWhile(5)); //输出结果:120
方法二:for方法
function factorialFor(num){
if(num<1){
return 1;
}else{
for(var i=num-1; i>=1; i--){
num*=i;
}
}
return num;
}
alert("for方法二:"+factorialFor(5)); //输出结果:120
方法三:递归方法
function factorial(num){
if(num<1){
return 1;
}
else{
return num*factorial(num-1);
}
}
alert("递归方法三:"+factorial(5)); //输出结果:120
题目3:如果给定的字符串是回文,返回true,反之,返回false。
回文:如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文)。
解题思路:去掉字符串多余的标点符号和空格,然后把字符串转化成小写来验证此字符串是否为回文。
function palindrome(str){
var str1 = str.replace(/[^0-9a-zA-Z]/g,"").toLowerCase(); //去掉标点符号,转化成小写,比较参数一
//alert(str1); //输出:abc1d42efg000h000gfe24d1cba
var str2 = str1.split("").reverse().join(""); //翻转字符串,比较参数二
//alert(str2); //输出:abc1d42efg000h000gfe24d1cba
if (str1 === str2) {
return true;
} else{
return false;
}
}
alert(palindrome("aBc,./1d42--==EFG0 00 h0-';'00gfE';./. 24d 1cBA")); //输出结果:true
题目4:找到提供的句子中最长的单词,并计算它的长度。
解题思路:1、转化成数组;2、根据元素长度排序;3、输出最长元素并返回长度。
function findLongestString(str){
var arr = str.split(" "); //转化成数组,注意split()括号里为一个空格
//alert(arr); //输出:I,love,China
var aSort = arr.sort(function (a,b){ //排序
return b.length-a.length;
});
//alert(aSort); //输出: China,love,I
document.write("最长单词:"+aSort[0]+"; "); //第一个元素为最长
document.write("单词长度:"+aSort[0].length);
}
findLongestString("I love China"); //输出结果: 最长单词:China; 单词长度:5
题目5:确保字符串的每个单词首字母都大写,其余部分小写。
解题思路:1、字符串转化成小写;2、分割成字符串数组;3、新组合字符串元素=首字母转大写+其余小写。
function titleCase(str){
var aStr = str.toLowerCase().split(" "); //转小写,分割成字符串数组
for(var i=0; i<aStr.length; i++){
aStr[i] = aStr[i][0].toUpperCase()+aStr[i].slice(1); //重新组合字符串元素
}
var oString = aStr.join(" "); //转成字符串
return oString;
}
document.write(titleCase("I'm a title Case.")); //输出结果:I'm A Title Case.
题目6:一个大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组。
解题思路 :找出每个小数组中的最大值,把最大值存入一个新数组里输出。
方法一:使用Math.max.apply()方法提取最大值
function largestArray(arr){
var result = []; //用于存放四个小数组中最大的数
for (var i=0; i<arr.length; i++) {
result.push(Math.max.apply(null, arr[i])); //找出四个小数组中的最大值,然后插入新数组
}
return result;
}
document.write(largestArray([[165,2,9], [48,6,9,82],[6,5],[29658,91,2]])+"</br>");//输出结果:165,82,6,29658
方法二:排序法提取最大值
function largestArr(arr){
var result = [];
for (var i=0; i<arr.length; i++) {
arr[i].sort(function(a, b) { //对四个小数组进行排序,从大到小
return b-a;
});
result.push(arr[i][0]); //把四个小数组中第一个(最大)添加到result
}
return result;
}
document.write(largestArr([[165,2,9], [48,6,9,82],[6,5],[29658,91,2]])+"</br>");//输出结果:165,82,6,29658
题目7:检查一个字符串(str)是否以指定的字符串(target)结尾。如果是,返回true;如果不是,返回false。
解题思路:截取字符串结尾部分(长度与target相同)与target做比较。
function confirmEnding(str, target){
var len = target.length;
var strEnding = str.slice(-len); //剪切字符串最后几个字符
if (strEnding == target) {
return true;
} else{
return false;
}
}
document.write(confirmEnding("strawberry", "rry")); //输出结果:true
题目8:重复一个指定的字符串 num次,如果num是一个负数则返回一个空字符串。
function repeat(str, num){
var result=str; //将初始值赋值给result
if (num<=0) {
return "";
} else{
for (var i=0; i<num-1; i++) { //索引从0开始,循环num-1次;(出现的次数包括它本身,所以只需要循环num-1次)
result+=str;
}
return result;
}
}
document.write(repeat("love", 3)); //输出结果:lovelovelove
题目9:截断一个字符串,如果字符串的长度比指定的参数num长,则把多余的部分用...来表示。
解题思路:截取相应长度的字符串,然后与...拼接起来。
- 规定的长度不包括...在内
function truncate(str, num){
var aStr = str.slice(0, num);
if (str.length > num) {
return aStr.concat("...");
}
else{
return str;
}
}
document.write(truncate("javascript", 8)+"</br>"); //输出结果:javascri...
- 规定的长度包括...在内
function truncate(str, num) {
var str1=str.slice(0,num-3);
var str2=str.slice(0,num);
if(str.length > num){
if(num<=3){
return str2+'...';
}else{
return str1+'...';
}
}else{
return str;
}
}
document.write(truncate("javascript", 8)); //输出结果:javas...
题目10:把一个数组arr按照指定的数组大小size分割成若干个数组块。
解题思路:定义一个空数组,使用slice()每次截取原数组的size个元素插入空数组形成一个新数组。
function chunk(arr, size){
var Array = [];
if (arr.length > size) {
for (var i=0; i<arr.length; i+=size) { //每次循环size个元素
Array.push("["+arr.slice(i,i+size)+"]"); //每次截取size元素加入Array(为了便于观察,添加了[])
}
return Array;
} else{
return "["+arr+"]";
}
}document.write(chunk([1,2,3,4,48,666],2)); //输出结果:[1,2],[3,4],[48,666]
题目11:返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始。
function slasher(arr, n){
var Array = [];
if (n<=0) {
return arr;
} else{
Array.push(arr.slice(n));
return Array;
}
}
document.write(slasher([1,516,15,85,3,841], 3)); //输出结果:85,3,841
题目12:如果数组第一个字符串元素包含了第二个字符串元素的所有字符,函数返回true。
解释:["hello", "Hello"]应该返回true,因为在忽略大小写的情况下,第二个字符串的所有字符都可以在第一个字符串找到。
function mutation(arr){
var str1 = arr[0].toLowerCase();
var str2 = arr[1].toLowerCase();
for (var i=0; i<str2.length; i++) {
if (str1.indexOf(str2[i]) <= -1) { //str2中有元素在str1中找不到
return false;
}
}
return true;
}
document.write(mutation(["Hello", "hey"])); //输出结果:true
indexOf()方法解释:可返回某个指定的字符串值在字符串中首次出现的位置。
语法:stringObject.indexOf(searchvalue,fromindex)
关键字:searchvalue,必选,规定需检索的字符串值fromindex,可选,从字符串的那个index开始检索
返回值:返回指定值在字符串首次出现的位置,若返回-1,则字符串中不包含改值。
题目13:删除数组中的所有假值。在JavaScript中,假值有false、null、0、""、undefined 和 NaN。
function bouncer(arr){
return arr.filter(test); //filter方法过滤得到符合条件的值
}
// 条件函数
function test(ele){
var cont = ele !== false || ele !== null || ele !== 0 || ele !== "" || ele !== undefined || ele !==NaN;
if (cont) { //如果cont成立
return ele;
}
}
document.write(bouncer([561, "hello", true, false, ""])); //输出结果:561,hello,true
Array.filter() :检查数组得到符合指定条件(fn)的所有元素。
语法:array.filter(function(currentValue,index,arr), thisValue)
关键字:currentValue,必选,当前元素的值; index,可选,当前元素的索引; arr,可选,当前元素所属的数组。thisvalue,可选,对象作为该执行回调时使用,传递给函数,用作 "this" 的值。如果省略了 thisValue ,"this" 的值为 "undefined"查看更多js面试题:https://blog.csdn.net/mr_javascript/article/details/79769572
-------------------------------------------- end ----------------------------------------------
参考文章:https://www.cnblogs.com/mr-wuxiansheng/p/6534910.html
下一篇: 腾讯2018秋招笔试题之贪吃的小Q