剑指offer 基础算法练习(四)

1.数组中只出现一次的两个数字

题目:

思路: 

第一种:indexOf()和lastIndexOf(),只要两个相等,就是只出现一次的数。
第二种:使用obj记录下每个数的次数,占空间

function FindNumsAppearOnce( array ) {
    // write code here
    let len = array.length
    let arr = []
    for(let i = 0; i<len; i++ ){
        if(array.indexOf(array[i]) === array.lastIndexOf(array[i])) {
            arr.push(array[i])
        }
    }
    return arr.sort((a,b) => a-b)
}
function FindNumsAppearOnce( array ) {
    // write code here
    let len = array.length
    let obj = {}
    for(let i = 0; i<len; i++) {
        if(!obj[array[i]]) {
            obj[array[i]] = 1
        }else {
            obj[array[i]] = obj[array[i]]+1
        }
    }
    let arr = []
    for(var k in obj) {
        if(obj[k] === 1) {
            arr.push(k)
        }
    }
    return arr.sort((a,b) => a-b)
}


2. 和为S的连续正数序列

题目:

思路: 定义两个数组,一个数组用于放连续数组序列,当条件符合时另一个数组存放符合条件的连续数组序列,当前序列的总和如果超过了S,就弹出序列最前的数,如还大于,再接着弹出序列最前的数。

function FindContinuousSequence(sum)
{
    // write code here
    let arr = [],
        res = [],
        total = 0
    for (let i = 1; i < sum; i++) {
        arr.push(i)
        total += i
        while(total > sum) {
            total -= arr[0]
            arr.shift()
        }
        if(total === sum) {
            res.push(arr.slice(0))
            total -= arr[0]
            arr.shift()
        }
        
    }
    return res
}


3. 和为S的两个数字

题目:

思路: 双指针

  1. 使用left 表示左边指向的值,使用right 表示右边指向的值。
  2. (left + right) 与 sum 大小情况 a. (left right)> sum, 则r--, 降低两数之和;
    b. (left + right) < sum, 则l ++,增大两数之和;
    c. (left + right) == sum ,则返回;

å¾ç说æ

function FindNumbersWithSum(array, sum)
{
    // write code here
    let left = 0,
        right = array.length - 1,
        num = 0
    while(left < right) {
        num = array[left] + array[right]
        if(num > sum) {
            right--
        }else if (num < sum) {
            left++
        }else {
            return [array[left],array[right]]
        }
    }
    return []
}


 

4. 左旋转字符串

题目:

 

思路:1.使用字符串substr()方法

           2.反转字符串:局部反转+整体反转

å¾ç说æ

function LeftRotateString(str, n)
{
    // write code here
    if (str === null) return ''
    if(str.length < n) {
        return str
    }
    let str1 = str.substr(0,n),
        str2 = str.substring(n)
    return str2 + str1
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值