注意示例代码统一为 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]))