首页

面试中遇到的那些编程题

胡西风_foxww
2023-06-14  阅读 214

判断一个字符串中出现次数最多的字符, 统计这个次数?

if(typeof String.prototype.countCharacters !== 'function'){
    String.prototype.countCharacters = function(){
        var i,letter,obj = {},len = this.length;

        for(i = 0;i < len;i++){
            letter = this[i];
            if(!obj[letter]){
                obj[letter] = 1;
            }else{
                obj[letter]++;
            }
        }

        var max_key,max_num = 0;
        for(var key in obj){
            if(max_num < obj[key]){
                max_num = obj[key];
                max_key = key;
            }
        }

        return {max_key: max_key,max_num: max_num};
    }
}

// 测试
var str = "abcdefgsddsfadsl";
var oNew = str.countCharacters();
console.log("出现次数最多的字母是:"+oNew.max_key+",共出现了"+oNew.max_num+"次。");复制代码

编写一个方法,求一个字符串的字节长度(假设一个中文占两个字节)

function getStrlen(str){
    var json = {len:0};
    // 基本汉字 Unicode 编码范围[4E00,9FA5]
    var reg = /[\u4E00-\u9FA5]/;
    for(var i = 0;i < str.length;i++){
        if(reg.test(str.charAt(i))){
            json.len++;
        }
    }

    return json.len + str.length;
}

// 测试
var str = "22粮食";
console.log(getStrlen(str)); // 6复制代码

编写一个方法实现数组去重

第一种是比较常规的方法

思路:

  1. 构建一个新的数组存放结果
  2. for 循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比
  3. 若结果数组中没有该元素,则存到结果数组中
// 函数式
function delArrRepeat(oldArr){
        var newArr = [oldArr[0]],len = oldArr.length;
        for(var i = 1;i < len;i++){
            if(newArr.indexOf(oldArr[i]) == -1){
                newArr.push(oldArr[i]);
            }
        }
        return newArr;
}
console.log(delArrRepeat([1,2,1,2,3,5,6,8,4,5]));

// 向字符串的原型对象上添加方法
if(typeof Array.prototype.delArrRepeat !== "function"){
    Array.prototype.delArrRepeat = function(){
        var newArr = [this[0]],len = this.length;
        for(var i = 1;i < len;i++){
            if(newArr.indexOf(this[i]) == -1){
                newArr.push(this[i]);
            }
        }
        return newArr;
    }
}
console.log([1,2,1,2,3,5,6,8,4,5].delArrRepeat());复制代码

第二种方法比上面的方法效率要高

思路:

  1. 先将原数组进行排序
  2. 检查原数组中的第 i 个元素 与 结果数组中的最后一个元素是否相同,因为已经排序,所以重复元素会在相邻位置
  3. 如果不相同,则将该元素存入结果数组中
Array.prototype.delArrRepeat = function(){
    this.sort(); //先排序
    var newArr = [this[0]],len = this.length;;
    for(var i = 1; i < len; i++){
        var lastNum = newArr.length - 1;
        if(this[i] !== newArr[lastNum]){
            newArr.push(this[i]);
        }
    }
    return newArr;
}
console.log([1,2,1,2,3,5,6,8,4,5].delArrRepeat());复制代码

第三种方法(推荐使用)

思路:

  1. 创建一个新的数组存放结果
  2. 创建一个空对象
  3. for 循环时,每次取出一个元素与对象进行对比,如果这个元素不重复,则把它存放到结果数组中,同时把这个元素的内容作为对象的一个属性,并赋值为 1,存入到第 2 步建立的对象中。

说明:

至于如何对比,就是每次从原数组中取出一个元素,
然后到对象中去访问这个属性,如果能访问到值,则说明重复。

Array.prototype.delArrRepeat = function(){
    var newArr = [];
    var obj = {};
    for(var i = 0; i < this.length; i++){
        if(!obj[this[i]]){
            newArr.push(this[i]);
            obj[this[i]] = 1;
        }
    }
    return newArr;
}
console.log([1,2,1,2,3,5,6,8,4,5].delArrRepeat());复制代码

使用原生 JS 深度克隆一个对象 (注意区分对象类型)

方法一

function deepClone(oldObj,newObj){
    // 如果存在newObj就newObj,否则用空对象
    var newObj = newObj || {};

    for(var key in oldObj){
        // 判断是不是对象的自身属性
        if(oldObj.hasOwnProperty(key)){
            //  判断属性是否是引用类型的
            if(typeof oldObj[key] === 'object'){
                // 如果是,再判断值是否是数组
                var c = (oldObj[key].constructor === Araay)?[]:[];
                // 递归
                newObj[key] = deepClone(oldObj[key],c);
            }else{
                // 如果不是引用类型,直接赋值
                newObj[key] = oldObj[key];
            }
        }
    }

    return newObj;
}

// 克隆测试
var arr = [5,8,6,4];
var oJson = {a:6,b:4,c:[1,2,3]};
var str = 'sdfslk';

var arr2 = deepClone(arr);
var oJson2 = deepClone(oJson);
var str2 = deepClone(str);

console.log(arr,"===",arr2);
console.log(oJson,"===",oJson2);
console.log(str,"===",str2);复制代码

方法二

function deepClone(oldObj) {
    var o = oldObj instanceof Array ? [] : {};
    for(var k in oldObj){
        o[k] = typeof oldObj[k] === Object ? deepClone(oldObj[k]) : oldObj[k];
    }
    return o;
}

// 克隆测试
var arr = [[1, 2, 3], [4, 5, 6, 7]];
var oJson = {a:6,b:4,c:[1,2,3]};
var str = 'sdfslk';

var arr2 = deepClone(arr);
var oJson2 = deepClone(oJson);
var str2 = deepClone(str);

console.log(arr,"===",arr2);
console.log(oJson,"===",oJson2);
console.log(str,"===",str2);复制代码

请完成下面的函数功能,使其测试通过

function string2int(s){
    //请完成该函数
}

if (string2int('0') === 0 && string2int('12345') === 12345 && string2int('12300') === 12300) {
    if (string2int.toString().indexOf('parseInt') !== -1) {
                alert('请勿使用parseInt()!');
    } else if (string2int.toString().indexOf('Number') !== -1) {
                alert('请勿使用Number()!');
    } else {
                alert('测试通过!');
    }
} else {
            alert('测试失败!');
}复制代码

答:

function string2int(s){
    return s.split("").map(function(x){
        return x - 0;
    }).reduce(function(x,y){
        var y = y || 0;
        return x*10 + y;
    });

    //或es6 箭头函数
    //return s.split('').map(strNum => strNum * 1).reduce((x, y) => x * 10 + y);
}

if (string2int('0') === 0 && string2int('12345') === 12345 && string2int('12300') === 12300) {
    if (string2int.toString().indexOf('parseInt') !== -1) {
                alert('请勿使用parseInt()!');
    } else if (string2int.toString().indexOf('Number') !== -1) {
                alert('请勿使用Number()!');
    } else {
                alert('测试通过!');
    }
} else {
            alert('测试失败!');
}复制代码
本文为作者原创文章,转载无需和我联系,但请注明来自 【前端黑猫】