前端--算法汇集(1)
一、判断一个单词是否是一个回文
回文是指把相同的词汇或句子,在下文中调换位置或颠倒过来,产生首尾回环的情趣,叫做回文,也叫回环。比如:mamam redivider
1.通常第一想法是用for将字符吕颠倒字母顺序然后匹配:
function checkPalindrom(str){
var len = str.length;
for(var i=0,arr = [] ; i<len ; i++){
arr.unshift(str[i])
}
return arr.join("");
}
2.相比方法1,其实本题重要的是对于 reverse() 的实现,我们可以利用现成的函数,将字符串转换成数组,这个思路很重要:
function checkPalindrom(str){
return str = str.split("").reverse().join("");
}
3.相比而言,自然是方法2更简单,二个方法只完成了对字符串的颠倒,要实现回文的效果,还需做进一步的拼接。
二、去掉一组整型数组重复的值
这道问题出现在诸多的前端面试题中,主要考察个人对Object的使用,利用Key来进行筛选:
function unique(arr){
var hash = {};
var data = [];
for(var i=0;i<arr.length;i++){
if(!hash[arr[i]]){
data.push(arr[i]);
hash[arr[i]] = " ";
}
}
console.log(data)
}
三、统计一个字符串出现最多的字母
function findMaxDuplicate(str){
var hashChar = {};
for(var i=0; i<str.length ;i++){
if(!hashChar[str[i]]){
hashChar[str[i]] = 1;
}else{
hashChar[str[i]]++
}
}
var maxChar = "",maxValue = 1;
for(var k in hashChar){
if(hashChar[k]>maxValue){
maxChar = k;
maxValue = hashChar[k]
}
}
console.log("出现最大的字符是:"+maxChar+",出现的次数是:"+maxValue);
}
四、排序算法
对于纯数字且个位数进行排序,可采用 sort() 函数;对于非数字或者超过有十位数的数字,js会查找各字符的unicode值,然后挨个进行unicode的比较,这就会出现诸如:
例如:str.sort([2,5,7,33,11,4,8,22,99,55,44,20])
输出结果:[11, 2, 20, 22, 33, 4, 44, 5, 55, 7, 8, 99]
这与我们想看到的结果是有区别的!
function bubbleSort(str){
var len = str.length;
for(var i= 0 ; i<len-1 ; i++){
for(var j=i+1 ; j<len ; j++){
if(str[i]>str[j]){
var tem = str[i];
str[i] = str[j];
str[j] = tem;
}
}
}
return str
}
一个快速排序的函数方法:其根本原理是将一个数组中的第一个字符与数组中的其他字符进行比较,将比当前值大的放入 rightArr 中,将比当前值小的放入 leftArr 中,内部调用当前函数,得到想要的结果;
function quickSort(arr){
if(arr.length<=1){
return arr;
}
var leftArr = [],rightArr = [],q = arr[0];
var len = arr.length;
for(var i=1 ; i<len ; i++){
if(arr[i]>q){
rightArr.push(arr[i]);
}else{
leftArr.push(arr[i]);
}
}
return [].concat(quickSort(leftArr),q,quickSort(rightArr));
}
对排序不太理解的同学,安利大家看看通过动画演示算法的实现:http://math.hws.edu/eck/jsdemo/sortlab.html
五、不借助临时变量,进行两个整数的交换
这个问题非常巧妙,需要大家跳出惯有的思维,利用a,b进行置换:
function swap(a,b){
a = a+b;
b = a-b;
a = a-b;
console.log(a,b)
}