那些年我们一起做过的面试题

96 阅读1分钟

image.png

1、手写一个计算器。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <div>
            <div>
                <span>数值:A</span>
                <input type="number" v-model="Anumerical">
            </div>
            <div>
                <span>数值:B</span>
                <input type="number" v-model="Bnumerical">
            </div>
        </div>
        <div>
        <button @click="hanshu(1)">+</button>
        <button @click="hanshu(2)">-</button>
        <button @click="hanshu(3)">X</button>
        <button @click="hanshu(4)">/</button> 
        <button @click="ling">重置</button>
        </div>
    </div>
    <script src="./vue.js"></script>
    <script>
        var guan = new Vue({
            el: '#app',
            data: {
                Anumerical: '',
                Bnumerical: ''
            },
            methods: {
                hanshu: function (z) {
                    if (this.Bnumerical) {
                        switch (z) {
                            case 1:
                            this.Anumerical = this.Anumerical * 1 + this.Bnumerical * 1
                               break;
                            case 2:
                            this.Anumerical = this.Anumerical - this.Bnumerical
                                break;
                            case 3:
                             this.Anumerical = this.Anumerical * this.Bnumerical
                                break;
                            case 4:
                            this.Anumerical = this.Anumerical / this.Bnumerical
                                break;
                            default:
                                break;
                        }
                        this.Bnumerical = ''
                    } else {
                        alert('请输入数值')
                    }
                },
                ling: function () {
                    this.Anumerical = '',
                        this.Bnumerical = ''
                }
            }
        })

    </script>
</body>
</html>

2、实现一个函数,对给定数组的value做去重后相乘,请尽量用原生方法实现! const array = [{value: 9}, {value: 2}, {value: 3}, {value: 3},{value: 5}, {value: 2}, {value: 5}]; 例如上面数组去重相乘结果为270:(9 * 2 * 3 * 5 = 270)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        const array = [
            { value: 9 },
            { value: 2 },
            { value: 3 },
            { value: 3 },
            { value: 5 },
            { value: 2 },
            { value: 5 },
        ]
        function changeChong(arr) {
            let newarr = []
            for (const key in arr) {
                newarr.push(arr[key].value)
            }

            var newArr2 = []
            for (var i = 0; i < newarr.length; i++) {
                if (newArr2.indexOf(newarr[i]) === -1) {
                    newArr2.push(newarr[i])
                }
            }

            let a = 1
            for (const key in newArr2) {
                a *= newArr2[key]
            }
            return a
        }

        console.log(changeChong(array)) //270
    </script>
</body>

</html>

3、给你2个数组a和b,  把2个数组合并, 返回合并后的数组 按 递减顺序 排列并过滤掉指定元素。 let arr1 = [1,8,3,10,3,2,9,2], arr2 = [2,5,6], element = 2 function concatArr(arr1,arr2,element){ } console.log(concatArr(arr1,arr2,element)) //[10,9,8,6,5,3,3,1]

      <!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        let arr1 = [1, 8, 3, 10, 3, 2, 9, 2]
        let arr2 = [2, 5, 6]
        let element = 2
        function concatArr(arr1, arr2, element) {
            let arr3 = arr1.push(...arr2)
            let arr4 = []
            arr1.forEach((v) => {
                if (v != element) {
                    arr4.push(v)
                }
            })
            for (var i = 0; i < arr4.length - 1; i++) {
                for (var j = 0; j < arr4.length - 1 - i; j++) {
                    if (arr4[j] < arr4[j + 1]) {
                        var temp = arr4[j]
                        arr4[j] = arr4[j + 1]
                        arr4[j + 1] = temp
                    }
                }
            }
            return arr4
        }
        console.log(concatArr(arr1, arr2, element)) //[10,9,8,6,5,3,3,1]
    </script>
</body>

</html>

4、给定一个非空的数字数组,数组有且只有一个非重复项,实现一个方法获取落单项

 <!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        function getSingleNumber(numbers) {

            var newsArr = [];
            numbers.forEach(function (item, index) {
                if (numbers.indexOf(item) == numbers.lastIndexOf(item)) {
                    newsArr.push(item);
                }
            })
            return newsArr;
        }
        var a = getSingleNumber([1, 2, 1, 2, 0]); //0
        console.log(a);
        var b = getSingleNumber([0, 1, 0, 0]); //1
        console.log(b)
        var c = getSingleNumber([1, 2, 3, 1, 2]); //3
        console.log(c);
        var d = getSingleNumber([1, 2, 3, 1, 2, 2]); //3
        console.log(d)
    </script>
</body>

</html>

5、有这样一个字符串 "www.baidu.com?key=1&name=test1&name=test2&c#&city=%E6%9D%AD%E5%B7%9E",要求转化成 {"key":1,"name":['test1','test2'],"c":'',"city":'杭州'}*

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      function getUrlDataFN(urlStr) {
        // 定义一个空对象以储存数据
        const urlObj = {}
        // 检查url中是否携带数据
        if (urlStr.indexOf("?") === -1) return null
        // 找到 '?' 对应的下标
        const index = urlStr.indexOf("?") // index = 20
        // 截取 '?' 后的内容
        const dataStr = urlStr.substr(index + 1) // key=1&name=test1&name=test2&c#&city=%E6%9D%AD%E5%B7%9E
        // console.log(dataStr)
        // 通过 '&' 将字符串分割成数组
        const dataArr = dataStr.split("&") // ['key=1', 'name=test1', 'name=test2', 'c#', 'city=%E6%9D%AD%E5%B7%9E']
        // console.log(dataArr)
        // 遍历字符串分割后的数组
        dataArr.forEach((str) => {
          // console.log("str", str)
          // 判断数组内的字符串是否有 '='
          if (str.indexOf("=") === -1) {
            // 如没有 '=' , 则将此字符串作为对象内键值对的键, 键值对的值为 ''
            urlObj[str] = "" // { c: '' }
          } else {
            // 如果有 '='
            // 通过 '=' 将此字符串截取成两段字符串(不推荐使用 split 分割, 因为数据中可能携带多个 '=' )
            const innerArrIndex = str.indexOf("=")
            // console.log("index", innerArrIndex)
            const key = str.substring(0, innerArrIndex)
            // console.log("key", key)
            const value = str.substr(innerArrIndex + 1)
            // console.log("value", value)
            // Js判断数组或对象中的key是否存在
            if (!urlObj.hasOwnProperty(key)) {
              // 以截取后的两段字符串作为对象的键值对  decodeURIComponent将uri格式转换为汉字
              urlObj[key] = decodeURIComponent(value) // {a: '1', b: '2', c: '', d: 'xxx'}
            } else {
              // console.log("测试", urlObj[key])
              var oldObj = urlObj[key]
              // console.log("老的", oldObj)
              // 判断是否为数组
              if (!(oldObj instanceof Array)) {
                // 不是转换为数组
                oldObj = [urlObj[key]]
              }
              oldObj.push(decodeURIComponent(value))
              urlObj[key] = oldObj
            }
          }
          // console.log(urlObj)
        })
        // 返回对象
        // console.log(urlObj)
        return urlObj
      }
      // console.log(escape("北京"))
      // encodeURIComponent()将汉字转化为utf-8的格式的uri
      console.log(encodeURIComponent("北京"))
      let url =
        "http://www.baidu.com?key=1&key=1&key=3&key=4&name=test1&name=test2&name=test3&c#&city=%E6%9D%AD%E5%B7%9E&city=%E5%8C%97%E4%BA%AC"
      let result = getUrlDataFN(url)
      console.log(result)
    </script>
  </body>
</html>

6、从一个树状数据结构中,找出值最大的一个节点

方法一:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    var tree = {
        id: "i1",
        value: 12,
        left: {
            id: "i3",
            value: 63,
            left: {
                id: "i8",
                value: 222
            },
            right: {
                id: "i91",
                value: 22
            }
        },
        right: {
            id: "i14",
            value: 26
        }
    }
    var list = []
    function www(tree) {
      for (var key in tree){
          if(key==='value'){
              list.push({
                  value:tree[key],
                  id:tree.id
              })
          }
          if(key==='left'){
              www(tree[key])
          }
          if(key==='right'){
              www(tree[key])
          }
      }
    }
    www(tree)
    var max2 = list.sort(function(a,b){
        return b.value-a.value;
    })[0];
    console.log(max2)
    console.log(list,'list')
</script>
</html>

方法二:
const Tree = {
        id: "i1",
        value: 12,
        left: {
            id: "i3",
            value: 63,
            left: {
                id: "i8",
                value: 222
            },
            right: {
                id: "i91",
                value: 22
            }
        },
        right: {
            id: "i14",
            value: 26
        }
    };
    let maxNode = {
        value: '',
        id: '',
    }
    function findMaxNode(tree) {
        for(let i in tree){
            if(Object.prototype.toString.call(tree[i]) === '[object Object]'){
                findMaxNode(tree[i])
            }else{
                if(i == 'value'){
                    if(tree.value > maxNode.value){
                        maxNode.value = tree.value;
                        maxNode.id = tree.id
                    }
                }
                
                
            }
        }
    }
    findMaxNode(Tree)
    console.log(maxValue)

7、翻转一个整数(不使用APi)

方法一:
<!DOCTYPE html>
<html lang="en">
 <head>
  <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Document</title>
   </head>
 <body>
     
  <script>
    function fanzhuan(n) {
      let plusOrMinus = 1
      if (n == 0) return 0
      if (n < 0) {
        plusOrMinus = -1
        n = -n
      }
      let jilu = 0 //记录每次计算的余数
      let jieguo = 0
      while (n > 0) {
        jilu = n % 10 //取余记录
        n = (n - jilu) / 10 //取余后减去上次取余的结果,然后除10,继续循环的主体
        jieguo = jieguo * 10 + jilu //取余相加
      }
      let res = jieguo * plusOrMinus
      return res
    }
    console.log(fanzhuan(0))
  </script>
   
</body>

</html>

方法二:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    let reversal = (num)=>{
    if (num == 0) {
        return 0
    }
    let flag = 1
    if (num < 0) {
        flag = -1
        num = -num
    }
    let newNum = 0
    while (num) {
        newNum = newNum * 10 + num % 10
        num = Math.floor(num / 10)
    }
    return flag * newNum

}
console.log(reversal(-3453))
  </script>

</body>
</html>