数据结构与算法(持续更新中....day01)

注意示例代码统一为 javascript

别问,问就是前端狗只会js(╥﹏╥)

一、排序

1.选择排序

对于一个数组长度为n的序列,使用选择排序,将该数组从小到大排序

let arr = [10, 2, 234, 23, 435, 231, 24, 56,1]
//选择排序
//第一趟从 n 个数选择最小的然后和 arr[0] 交换
//第二趟从 n-1 个数选择最小的然后与 arr[1] 交换
//...
function selectSort(arr){
    //选择排序
    if(arr == null || arr.length < 2){
        return 
    }
    for(let i = 0; i < arr.length-1; i++){
        minIndex = i
        for(let j = i + 1; j < arr.length; j++){
            minIndex = arr[minIndex] > arr[j] ? j : minIndex//寻找最小值的下标
        }
        //解构赋值,实现交换
        [arr[i] , arr[minIndex]] = [arr[minIndex], arr[i]]
    }
    return arr
}
console.log(selectSort(arr))

2.冒泡排序

对于一个数组长度为n的序列,使用选择排序,将该数组从小到大排序

//对于冒泡排序来说,从小到大排序
//第一趟的冒泡 ,能确定数组中的最大值
//每遍历一趟,最大值就会被冒泡在顶端
let arr = [23, 12, 45, 24, 22, 44, 83, 21, 17]
function bubbleSort(arr){
    //冒泡排序
    for(let i = 1; i <= arr.length; i++){
        for(let j = 0; j < arr.length - i + 1; j++){
            if(arr[j] > arr[j+1]){
                [arr[j], arr[j+1]] = [arr[j+1], arr[j]]
            }
        }
    }
    return arr
}
console.log(bubbleSort(arr))

3.异或运算

前置知识:

0 ^ x = x 零 异或 x 等于 x,

x ^ x = 0 自己 异或 自己等于 0

//1.题目描述:给定一个数组(允许重复),有且仅有一个数组元素出现的次数为奇数,其他元素出现的次数都为偶数,求这个数组元素
//输入: arr = [1, 1, 2, 2, 3, 3, 3]
//输出: 3
function diffFun1(arr){
    //思路: 使用异或运算, 将变量 eval 与数组的每一个元素进行异或,最后得出的结果即出现次数为奇数的数组元素
    //因为奇数个异或 x^x^x = x
    let eval = 0//初始化0
    for(let i=0; i< arr.length; i++){
        eval ^= arr[i]
    }
    return eval
}
console.log(diffFun1([1, 1, 2, 2, 3, 3, 4, 4, 4]))

题目一的进阶: 比较难一点,需要抓住 两个数在某一位上的不同,将其分类

//2.题目描述: 给定一个数组(允许重复),有两个数组元素出现的次数为奇数,其他元素出现的次数都为偶数,求这两个数组元素
//输入: arr = [1, 1, 2, 2, 3, 3, 3, 4, 4, 4]
//输出: 3, 4
function diffFun2(arr){
    let eval = 0
    for(let i=0; i< arr.length; i++){
        eval ^= arr[i]
    }
    //我们不妨假设 题目要求的这两个数组元素为 a b
    //此时的 eval = a^b 
    //a与b一定是不同的数,所以 eval !=0 ,eval的某一位一定为1 并且在这一位上 a 与 b 的值不同
    let rightOne = eval & (~eval+1)//~eval+1这个是eval的补码,原码与补码的与运算求出最右边的1
    //例如 eval 1010111100     (为了帮助理解进行具体例子假设)假设a为 xxxx xxx 1 xx b为 xxxx xxx 0 xx
    // eval的反码 0101000011
    // eval的补码 0101000100
    //rightOne的结果为 补码与原码 0000000100
    let eval2 = 0
    for(let i =0 ; i < arr.length;i++){
        if((arr[i] & rightOne) == 0){//从数组中筛选出在相同位置上 与rightone为1的数据元素,然后进行异或
            
            //前面假设了a为 xxxx xxx 1 xx b为 xxxx xxx 0 xx
            //所以到这一步只有 a & rightOne的值为 0,而b进行 与 运算不能得出0
            //在上面的假设下(具体例子下) eval2 = a
            
            eval2 ^= arr[i]
        }
    }
    //eval2运算的结果要么是 a 要么是 b
    return [eval2, (eval ^ eval2)]
}
console.log(diffFun2([1, 1, 2, 2, 3, 3, 3, 4, 4, 4]))

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值