js刷林扣 lintcode(2017年7月~8月)

433.岛屿的个数 (7.2)

给一个01矩阵,求不同的岛屿的个数。

0代表海,1代表岛,如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。

样例

[
  [1, 1, 0, 0, 0],
  [0, 1, 0, 0, 1],
  [0, 0, 0, 1, 1],
  [0, 0, 0, 0, 0],
  [0, 0, 0, 0, 1]
]
// 输出3

思路

创建一个visited数组来保存访问过的位置,初始化全为false,访问当前位置则置为true。遍历目标矩阵,没有访问过的点就递归他的上下左右四个点。

程序

function main(arr){
    if(!arr||arr.length==0) return 0
    const LEN=arr.length
    const LEN2=arr[0].length
    const row=Array(LEN2).fill(false)
    const visited=Array(LEN).fill(row) // 访问过的数组
    let res=0
    for(let i=0;i<LEN;i++){
        for(let j=0;j<LEN2;j++){
            if(arr[i][j]&&!visited[i][j]){
                DPSlands(arr,visited,i,j)
                res++
            }
        }
    }
    return res
}

function DPSlands(arr,visited,i,j){
    if(i<0||i>=arr.length) return;
    if(j<0||j>=arr[0].length) return;
    if(!arr[i][j]||visited[i][j]) return;

    visited[i][j]=true
    DPSlands(arr, visited, i - 1, j);
    DPSlands(arr, visited, i, j - 1);
    DPSlands(arr, visited, i + 1, j);
    DPSlands(arr, visited, i, j + 1);
}

console.log(main(arr)) // 3

457.经典二分查找问题

在一个排序数组中找一个数,返回该数出现的任意位置,如果不存在,返回-1

样例

给出数组 [1, 2, 2, 4, 5, 5].

对于 target = 2, �返回 1 或者 2.
对于 target = 5, �返回 4 或者 5.
对于 target = 6, �返回 -1.

挑战

O(logn) 的时间

const arr=[1, 2, 2, 4, 5, 5]

function findPosition(arr,target){
    let start=0,end=arr.length-1,mid=null
    let res=[]

    if(!arr||target>arr[end]||target<arr[start]) return -1;
    while(start<=end){
        mid=Math.ceil((end-start)/2)
        if(target==arr[mid]) return mid
        if(target<arr[mid]){
            end=mid
        }
        if(target>arr[mid]){
            start=mid
        }

        if(arr[start]==target) return start;
        if(arr[end]==target) return end;

        if(start==end-1) return -1;
    }
}

console.log(findPosition(arr,2))//2

488.快乐数 (7.5)

写一个算法来判断一个数是不是"快乐数"。

一个数是不是快乐是这么定义的:对于一个正整数,每一次将该数替换为他每个位置上的数字的平方和,然后重复这个过程直到这个数变为1,或是无限循环但始终变不到1。如果可以变为1,那么这个数就是快乐数。

样例

19 就是一个快乐数。

1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
const MAX_TIMES=9999 //设置一个递归的最大次数

function isHappy(num,time){
    let sum=0,times=time||0
    const str=num.toString()
    for(let i=0;i<str.length;i++){
        let a=str.charAt(i)
        sum+=a*a
        times++
    }
    if(sum==1) return '快乐'
    if(times>MAX_TIMES) return '不快乐'
    return isHappy(sum,times)
}

console.log(isHappy(19)) //快乐
console.log(isHappy(16)) //不快乐

491.回文数(7.6)

判断一个正整数是不是回文数。

回文数的定义是,将这个数反转之后,得到的数仍然是同一个数。

样例

11, 121, 1, 12321 这些是回文数。

23, 32, 1232 这些不是回文数。

function palindromeNumber(num){
    if(!num) return false
    const str=num.toString()
    if(str.length==1) return true
    for(let i=0;i<str.length/2;i++){
        if(str.charAt(i)!=str.charAt(Math.abs(str.length-i-1))) return false
    }
    return true
}

console.log(palindromeNumber(1331)) //true
console.log(palindromeNumber(23)) //false
console.log(palindromeNumber(3)) //true

499.单词计数 (Map Reduce版本) (7.10)

使用 map reduce 来计算单词频率

样例

chunk1: "Google Bye GoodBye Hadoop code"
chunk2: "lintcode code Bye"


Get MapReduce result:
    Bye: 2
    GoodBye: 1
    Google: 1
    Hadoop: 1
    code: 2
    lintcode: 1

实现

const obj={
    chunk1: "Google Bye GoodBye Hadoop code",
    chunk2: "lintcode code Bye"
}

function WordCount(obj){
    let res={}
    const arr=Object.keys(obj).reduce((key1,key2)=>{
        return obj[key1].split(/\s/).concat(obj[key2].split(/\s/))
        })
    arr.forEach((word)=>{
         res[word]=res.hasOwnProperty(word)?++res[word]:0
    })
    return res
}

console.log(WordCount(obj)) //Object {Google: 0, Bye: 1, GoodBye: 0, Hadoop: 0, code: 1…}

517.丑数(7.11)

写一个程序来检测一个整数是不是丑数。

丑数的定义是,只包含质因子 2, 3, 5 的正整数。比如 6, 8 就是丑数,但是 14 不是丑数以为他包含了质因子 7。

样例

给出 num = 8,返回 true。
给出 num = 14,返回 false

实现

function isUgly(num){
    if(num<=0) return false
        if(num==1) return true
            const primeNumArr=[2,3,5]
    while(num>1){
        let divider=-1
        for(let i=0;i<primeNumArr.length;i++){
            if(num%primeNumArr[i]==0){
                divider=primeNumArr[i]
                break;
            }
        }
        if(divider==-1) return false
        num/=divider
    }
    return true
}

console.log(isUgly(6)) //true
console.log(isUgly(14)) //false

524.左填充(8.23)

题目链接
实现一个leftpad库,如果不知道什么是leftpad可以看样例

样例

leftpad("foo", 5)
>> "  foo"

leftpad("foobar", 6)
>> "foobar"

leftpad("1", 2, "0")
>> "01"

实现

普通实现

function leftpad(str,maxLen,fillStr=' '){
    if(arguments.length==0) return false;
    if(!maxLen&&!fillStr||str.length>maxLen||isNaN(maxLen)) return str;
    let filledStr=''
    const filledStrLen=maxLen-str.length
    for(let i=0;i<filledStrLen;i++){
        filledStr+=fillStr
    }
    return filledStr.slice(0,filledStrLen)+str
}
console.log(leftpad("foo", 5)) // '   foo'

然而,js怎么会连这么简单的操作都没有封装成一个方法哩OVO,我们可以用padStart()进行实现~~

function leftpad(str,maxLen,fillStr){
    return str.padStart(maxLen,fillStr)
}
console.log(leftpad("foo", 5)) // '   foo'

539.移动零(8.24)

给一个数组 nums 写一个函数将 0 移动到数组的最后面,非零元素保持原数组的顺序
题目链接

样例

给出 nums = [0, 1, 0, 3, 12], 调用函数之后, nums = [1, 3, 12, 0, 0].

实现

function moveZeroes(arr){
    let len=arr.length
    if(!arr||len<1) return;
    let i=0
    while(i<len){
        if(arr[i]===0){
            arr.splice(i,1)
            arr.push(0)
            len--
        }else{
            i++
        }
    }
    return arr
}

// moveZeroes([4, 0, 0, 3, 12])
// [4, 3, 12, 0, 0]

有前后两个指针,当删除一个元素并在尾部添加一个元素时,后面的指针往前移动,前面的进行遍历的指针保持不动。

547.两数组的交(8.25)

题目链接
返回两个数组的交

结果中的元素必须是唯一的。结果可以是任何顺序。

样例

nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2].

实现

function intersection(arr1,arr2){
    let res=[]
    const LEN1=arr1.length
    const LEN2=arr2.length

    arr1.sort()
    arr2.sort()

    const Arr=arr1.concat(arr2)

    let i=0,j=LEN1
    while(i<LEN1&&j<LEN1+LEN2){
        if(Arr[i]<Arr[j]){
            i++
        }else if(Arr[i]>Arr[j]){
            j++
        }else{
            if(Arr[i]!=res[res.length-1]){
                res.push(Arr[i])
            }
            i++
            j++
        }
    }
    return res
}

console.log(intersection([1,1,2,2],[2,3,3,6,1])) // [1, 2]

排序后放到一个数组里,和上面那道题的算法差不多,都是用两个指针,只不过另一个是从数组中部遍历。

548.两数组的交 II(8.28)

计算两个数组的交
每个元素出现次数得和在数组里一样

答案可以以任意顺序给出

样例

nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2].

实现

代码就不举例了,只是把上面那道题最后的判断条件去掉就是此题的解题过程了。

569.各位相加(8.29)

相关链接
给出一个非负整数 num,反复的将所有位上的数字相加,直到得到一个一位的整数。

样例

给出 num = 38。

相加的过程如下:3 + 8 = 11,1 + 1 = 2。因为 2 只剩下一个数字,所以返回 2。

实现

这个就是很简单的递归,在js中要注意类型转换,还有使用reduce时要分配初始值。

function addDigits(num){
    if(isNaN(num)) return;
    if(num<10) return num
    const res=num.toString().split('').reduce((sum,value)=>{
        return sum+Number(value)
    },0)
    return addDigits(res)
}

挑战

你可以不用任何的循环或者递归算法,在 O(1) 的时间内解决这个问题么?

实现

简直玄学~~~

function addDigits(num){
    if(num!=0 && num%9==0) return 9;
        return num%9;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • 3.10 69.给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) 二叉树的层次遍历样例给一棵二叉树 {3...
    mytac阅读 1,058评论 3 3
  • 题目前的数字是对应的lintcode的题目序号 14.二分查找 给定一个排序的整数数组(升序)和一个要查找的整数t...
    mytac阅读 649评论 1 2
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,196评论 0 4
  • 易燃易爆炸 第一章 “你以为这是什么地方,还能由得了你们这些毛都没长全的小孩儿撒野?” “大晚上还闹!闹你他妈的什...
    一颗荣w阅读 283评论 0 0
  • rebar3在windows下不能使用的原因是因为无法下载deps的依赖包,只能下载内置的hex库里面的包,我们可...
    5a532ea43623阅读 4,031评论 0 2