zoukankan      html  css  js  c++  java
  • 前端面试中常见的算法问题

    Q1.判断一个单词是否是回文?
    回文是指把相同的词汇或句子,在下文中调换位置或颠倒过来,产生首尾回环的情趣,叫做回文,也叫回环。比如 mamam redivider .
    很多人拿到这样的题目非常容易想到用for 将字符串颠倒字母顺序然后匹配就行了。其实重要的考察的就是对于reverse的实现。其实我们可以利用现成的函数,将字符串转换成数组,这个思路很重要,我们可以拥有更多的自由度去进行字符串的一些操作。
    function checkPalindrom(str) {  
        return str == str.split('').reverse().join('');
    }
    Q2 去掉一组整型数组重复的值

    比如输入: [1,13,24,11,11,14,1,2]

    输出: [1,13,24,11,14,2] 需要去掉重复的11 和 1 这两个元素。

    这道问题出现在诸多的前端面试题中,主要考察个人对Object的使用,利用key来进行筛选。

    /**
    * unique an array 
    **/
    let unique = function(arr) {  
      let hashTable = {};
      let data = [];
      for(let i=0,l=arr.length;i<l;i++) {
        if(!hashTable[arr[i]]) {
          hashTable[arr[i]] = true;
          data.push(arr[i]);
        }
      }
      return data
    
    }
    Q3 统计一个字符串出现最多的字母  ??

    给出一段英文连续的英文字符窜,找出重复出现次数最多的字母

    输入 : afjghdfraaaasdenas

    输出 : a

    function findMaxDuplicateChar(str) {  
      if(str.length == 1) {
        return str;
      }
      let charObj = {};
      for(let i=0;i<str.length;i++) {
        if(!charObj[str.charAt(i)]) {
          charObj[str.charAt(i)] = 1;
        }else{
          charObj[str.charAt(i)] += 1;
        }
      }
      let maxChar = '',
          maxValue = 1;
      for(var k in charObj) {
        if(charObj[k] >= maxValue) {
          maxChar = k;
          maxValue = charObj[k];
        }
      }
      return maxChar;
    
    }
    Q4 排序算法

    如果抽到算法题目的话,应该大多都是比较开放的题目,不限定算法的实现,但是一定要求掌握其中的几种,所以冒泡排序,这种较为基础并且便于理解记忆的算法一定需要熟记于心。

    冒泡排序算法就是依次比较大小,小的的大的进行位置上的交换。

    function bubbleSort(arr) {  
        for(let i = 0,l=arr.length;i<l-1;i++) {
            for(let j = i+1;j<l;j++) { 
              if(arr[i]>arr[j]) {
                    let tem = arr[i];
                    arr[i] = arr[j];
                    arr[j] = tem;
                }
            }
        }
        return arr;
    }

     除了冒泡排序外,其实还有很多诸如 插入排序,快速排序希尔排序等。每一种排序算法都有各自的特点。全部掌握也不需要,但是心底一定要熟悉几种算法。

    比如快速排序,其效率很高,而其基本原理如图(来自wiki):

    算法参考某个元素值,将小于它的值,放到左数组中,大于它的值的元素就放到右数组中,然后递归进行上一次左右数组的操作,返回合并的数组就是已经排好顺序的数组了。

    function quickSort(arr) {
    
        if(arr.length<=1) {
            return arr;
        }
    
        let leftArr = [];
        let rightArr = [];
        let q = arr[0];
        for(let i = 1,l=arr.length; i<l; i++) {
            if(arr[i]>q) {
                rightArr.push(arr[i]);
            }else{
                leftArr.push(arr[i]);
            }
        }
    
        return [].concat(quickSort(leftArr),[q],quickSort(rightArr));
    }

    转载 http://www.jackpu.com/qian-duan-mian-shi-zhong-de-chang-jian-de-suan-fa-wen-ti/

           https://github.com/AragornZJF/JavaScript-Algorithm-Learning 【源码】

  • 相关阅读:
    ansible变量
    nginx连接php测试
    redis发布订阅
    堡垒机实例以及数据库操作
    nginx简介,使用
    protobuf
    go NSQ
    go mod
    GIT版本管理工具教程
    linux命令查询网站
  • 原文地址:https://www.cnblogs.com/zjf-1992/p/6091149.html
Copyright © 2011-2022 走看看