面试中遇到的那些编程题
判断一个字符串中出现次数最多的字符, 统计这个次数?
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复制代码
编写一个方法实现数组去重
第一种是比较常规的方法
思路:
- 构建一个新的数组存放结果
- for 循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比
- 若结果数组中没有该元素,则存到结果数组中
// 函数式
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());复制代码
第二种方法比上面的方法效率要高
思路:
- 先将原数组进行排序
- 检查原数组中的第 i 个元素 与 结果数组中的最后一个元素是否相同,因为已经排序,所以重复元素会在相邻位置
- 如果不相同,则将该元素存入结果数组中
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());复制代码
第三种方法(推荐使用)
思路:
- 创建一个新的数组存放结果
- 创建一个空对象
- 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('测试失败!');
}复制代码
本文为作者原创文章,转载无需和我联系,但请注明转载链接。 【前端黑猫】