javascript基础算法题
本文汇集了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"