js,ts手写面试题之递归,去重,冒泡等

1.用递归方法求1~100的和

function add(num1,num2){
	if(num2+1>100){
		return num1+num2;
	}else{
		return add(num1+num2,num2+1);
	}
}
let sum=add(1,2) //sum=5050

2.数组去重

let arr = [1, 1, 2, 2, 8, 8,5,4]
let newarr=[]
arr.forEach(function (item) {
    if (newarr.indexOf(item) === -1) {
        newarr.push(item)
    }
})
console.log(newarr)  //[1,2,8,5,4]

ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。Set 本身是一个构造函数,用来生成 Set 数据结构。Array.from 方法可以将 类数组或者集合转为数组,返回一个新数组。

let arr = [1, 1, 2, 2, 9, 5, 4]
function unique(arr) {
    return Array.from(new Set(arr))
}
let a=unique(arr)
console.log(a)

此处可以简写(注意如果arr=“aab”,返回的也是数组形式的[ab])

let arr = [1,2,1,4]
let a = Array.from(new Set(arr))
console.log(a)

3.字符串去重

let str = "aabbccd"
let newarr = []
for (let char of str) {
    if (newarr.indexOf(char) === -1) {
        newarr.push(char)
    }
}
console.log(newarr.toString()) // "abcd"

4.字符串反转

方法一:使用内置函数reverse()

let str = "abcde"
let newstr = str.split("")
newstr.reverse()
newstr.join("")
console.log(newstr.toString())

方法二:使用函数unshift() 向数组的开头添加一个或者多个元素 (IE不支持)

let str = "abcde"
let newstr=[]
for (let s of str) {
    newstr.unshift(s)
}
let result = newstr.toString()
console.log(result)

5.冒泡排序

从第一个开始,与后面一个数进行比较,比后面的数大就交换位置,这样第一轮最后一个数就是最大值,第二轮最后一个值就不需要比较所以每次比较个数就减去i。

let a = [1, 3, 5, 78, 99, 4, 5, 77, 33, 22, 43, 65];
let t
for (let i = 0; i <a.length-1; i++) {
    for (let j = 0; j < a.length-1-i; j++) {
        if (a[j] > a[j + 1]) {
            t = a[j + 1]
            a[j + 1] = a[j]
            a[j] = t
        }
    }
}

6.sort()对象排序

let a = [
    { age: 51 },
    { age: 23 },
    { age: 53 },
    { age: 12 },
    { age: 24 },
    { age: 33 },
    { age: 53 },
    { age: 65 },
    { age: 8 },
    { age: 91 },
];
a.sort(function (a, b) {
    return a.age - b.age  //从小到大
})

7.每执行一次函数,结果增1

(闭包相关的局部变量在函数调用结束后会继续存在)

const func = (function () {
	//补充函数内容
    let a = 1
    return function () {
        return a++  //这里形成了闭包
    }
})();
console.log(func()); // -> 1

console.log(func()); // -> 2

console.log(func());// -> 3 

8.找出字符串中出现最多的字符和次数

function test() {
    let str = "ababsdegabdsdbbb"
    let obj = {}
    for (let i = 0; i < str.length - 1; i++){
        if (obj[str[i]]) {
            obj[str[i]]++
        } else {
            obj[str[i]]=1
        }
    }
    let value;
    let count = 0;
    //此处使用for in 遍历对象
    for (let j in obj) {
        if (obj[j]> count) {
            value = j
            count=obj[j]
        }     
    }
    console.log(value,count)
}
test()

9.事件委托(冒泡)

事件冒泡的原理来实现的,当你点击最下面的节点的时候,事件就会逐步向上传播事件,一层一层的向外执行

 <ul id="aaa">
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
      <li>5</li>
    </ul>

e对象提供了一个属性叫target,可以返回事件的目标节点

  let dom = document.getElementById("aaa");
      console.log(dom);
      dom.onclick = function (e) {
        console.log("111");
        alert(e.target.innerText);
      };
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 实现一个数组去重的函数 思路:使用对象来存储数组中的元素,遍历数组,若元素在对象中不存在,则存储到对象中,并将其推入新数组中。 2. 实现一个函数,判断一个字符串是否是回文字符串 思路:将字符串翻转,与原字符串比较是否相等。 3. 实现一个函数,可以将多维数组转化为一维数组 思路:使用递归来遍历多维数组,将每个元素推入新数组中,直到遍历完所有元素。 4. 实现一个函数,统计一个字符串中出现次数最多的字符 思路:使用对象来存储每个字符出现的次数,遍历字符串,将每个字符存储到对象中,找到出现次数最多的字符。 5. 实现一个函数,实现数组的冒泡排序 思路:使用双重循环遍历数组,比较相邻两个元素的大小,如果前者大于后者,则交换两个元素的位置,直到遍历完数组。 6. 实现一个函数,实现数组的快速排序 思路:选择数组中的一个元素作为基准点,将数组分为两个部分,一部分大于基准点,一部分小于基准点,递归处理两个部分。 7. 实现一个函数,实现数组的深拷贝 思路:使用递归遍历数组中的每个元素,判断元素类型,如果是对象或数组,则进行深拷贝,如果是基本类型,则直接复制。 8. 实现一个函数,实现函数的柯里化 思路:使用闭包保存参数,当参数个数达到预设值时,执行函数。 9. 实现一个函数,实现函数的节流 思路:使用定时器来控制函数执行的频率,每次函数执行时,清除定时器并重新设置一个定时器。 10. 实现一个函数,实现函数的防抖 思路:使用定时器来延迟函数执行,每次函数执行时,清除定时器并重新设置一个定时器。如果在定时器延迟时间内再次触发函数,则重新计时。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值