数组简单算法题

LeedCODE

力扣

简单:

第一页中414之前的

第二页中697,704, 

1.给你一个数组 nums 和一个值 val,你需要移除所有数值等于 val 的元素,并返回移除后数组的新长度

var nums = [3,2,2,3]
var val = 3

在上面的代码中,当使用 splice(i, 1) 删除数组中的元素后,如果不将索引 i 回退一步,就会跳过下一个元素的检查。这是因为每次删除一个元素后,原本位于 i+1 索引位置的元素会向前移动到 i 的位置,而在下一轮循环时 i 会自增,导致实际上跳过了刚刚移动过来的元素。

通过将索引 i 回退一步,可以确保在删除元素后正确地继续遍历数组,避免漏掉需要检查的元素。这样可以保证每个元素都能被正确地检查并处理,从而实现正确的删除操作。


var removeElement= funcion(nums,val){
   for (let i = 0; i < nums.length; i++) {
       if(nums[i] === val){
          nums.splice(i,1);
          i--
       }
    }
    return nums.length
}

删除有序数组中重复项,使每个元素只出现一次

var nums = [3,2,2,3]

var removeDuplicates = function(nums) {
   for(let i = 0; i < nums.length; i++){
        if(nums[i] == nums[i+1]){
            nums.splice(i,1)
            i--
        }
   }
};

 js 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。双指针的方法

我们使用两个指针 leftright,其中 left 指向当前非零元素应该放置的位置,而 right 则用于遍历数组。当遇到非零元素时,将其移动到 left 的位置,并递增 left 指针。最后,将剩余位置填充为 0,即可达到将所有零移动到数组末尾并保持非零元素相对顺序的效果。 

let nums = [0,1,0,3,12]
var moveZeros = function(nums){
    let left = 0;
    let right = 0;
    while(right < nums.length){
        if(nums[right] !== 0){
            nums[left] = nums[right]
            left++
        }
        right++
    }

    while(left < nums.length){
        nums[left] = 0
        left++;
    }
}

数组对象的方法练习


var arr = [{label:'男',value: 1}, {label:'女',value: 0}]转成obj = {'1': '男', '0': '女'}

var arr = [{label: '男', value: 1},{label: '女', value: 0}]
function f(arr){
    let obj = {}
    arr.forEach(item => {
        obj[item.value] = item.label
    })
    return obj
}
var obj = f(arr)
console.log(obj)
// obj = {'1': '男', '0': '女'}

 var arr = [{label:'男',value: 1}, {label:'女',value: 0}]转成arr2 = ['男','女’]

var arr1 = [{label:'男',value: 1}, {label:'女',value: 0}]
 
function f1(arr) {
    // 写代码,得到
    return arr2 = arr.map(item => {return item.label})
}
var arr2 = f1(arr1);
console.log(arr2)
// arr2 = ['男', '女']

 var obj = {label: '男',value:1,age:18}转成arr = ['男',1,18]

var obj = {label:'男',value: 1,age: 18}
 
function f3(obj) {
    // 写代码,得到
    return Object.values(obj)
}
var arr = f3(obj);
console.log(arr)
// arr = ['男', '1', '18'] // 所有的属性值取出来,保存在数组中

给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数(不懂)

示例 1:

输入:[3, 2, 1]
输出:1
解释:第三大的数是 1 。

示例 2:

输入:[1, 2]
输出:2
解释:第三大的数不存在, 所以返回最大的数 2 。

示例 3:

输入:[2, 2, 3, 1]
输出:1
解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。
此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。

 

我们可以遍历数组,同时用一个有序集合来维护数组中前三大的数。具体做法是每遍历一个数,就将其插入有序集合,若有序集合的大小超过 333,就删除集合中的最小元素。这样可以保证有序集合的大小至多为 333,且遍历结束后,若有序集合的大小为 333,其最小值就是数组中第三大的数;若有序集合的大小不足 333,那么就返回有序集合中的最大值。

var thirdMax = function(nums) {
    let first, second, third;
    for(const num of nums){
        if(first === undefined || num > first){
            third = second;
            second = first;
            first = num;
        // 必须去除相等的情况,重复的数字不考虑
        } else if(first > num && (second === undefined || num > second)){
            third = second;
            second = num;
        } else if(second > num && (third === undefined || num > third)){
            third = num;
        }
    }
    return third !== undefined ? third : first;
};

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值