面试题 17.11. 单词距离|刷题打卡

简介: 有个内含单词的超大文本文件,给定任意两个单词,找出在这个文件中这两个单词的最短距离(相隔单词数)。如果寻找过程在这个文件中会重复多次,而每次寻找的单词不同,你能对此优化吗?

一、题目描述:


有个内含单词的超大文本文件,给定任意两个单词,找出在这个文件中这两个单词的最短距离(相隔单词数)。如果寻找过程在这个文件中会重复多次,而每次寻找的单词不同,你能对此优化吗?


示例:

输入:words = ["I","am","a","student","from","a","university","in","a","city"], word1 = "a", word2 = "student"

输出:1


提示:

  • words.length <= 100000


二、思路分析:


思路一:


暴力破解:

记录返回的初始值temp为words数组长度。第一次循环words,第一次出现word1的时侯,再循环一次words,找到word2出现的下标。此时word1和word2差值的绝对值与temp相比,去最小值。

外循环中,如果不止一次出现word1,就会依次循环比较,在内循环中更新temp的最小值。


思路二:

使用一次循环。

定义temp为返回值words.length,w1为word1出现的下标,w2为word2出现的下标。

在循环中,可以记录两个word出现的下标,如果两个都不等于零,则说明已经获取到两个word的最初下标。word1和word2差值的绝对值与temp相比,取小值。

此时还会碰到一种情况,word1或word2只出现在数组的最前面,那么直接将temp取两数下标之差的绝对值。


三、AC 代码:


方法一:


function findClosest(words: string[], word1: string, word2: string): number {
    let temp = words.length;
    for (let i = 0; i < words.length; i++) {
        if (words[i] === word1) {
            for (let j = 0; j < words.length; j++) {
                if (words[j] === word2) {
                    temp = Math.min(Math.abs(i - j), temp);
                }
            }
        }
    }
    return temp;
};


方法二:


function findClosest(words: string[], word1: string, word2: string): number {
    let temp = words.length;
    let w1;
    let w2;
    for (let i = 0; i < words.length; i++) {
        if (words[i] === word1) w1 = i;
        if (words[i] === word2) w2 = i;
        if (w1 > 0 && w2 > 0)
            temp = Math.min(Math.abs(w2 - w1), temp);
    }
    if(w1 === 0|| w2 === 0) temp = Math.abs(w2 - w1);
    return temp;
};


四、总结:


第一种暴力破解应该没什么难的,主要是使用单循环时会遗漏其他情况。


题目来源:leetcode。


作者:ClyingDeng

链接:https://juejin.cn/post/6939083966087430174

来源:稀土掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

目录
相关文章
|
6月前
|
存储 算法 安全
【刷题】 leetcode 面试题 01.06 字符串压缩
来看效果: 非常好!!!过啦!!!
65 5
【刷题】 leetcode 面试题 01.06 字符串压缩
|
6月前
|
算法
【刷题】 leetcode 面试题 08.05.递归乘法
递归算法是一种在计算机科学和数学中广泛应用的解决问题的方法,其基本思想是利用问题的自我相似性,即将一个大问题分解为一个或多个相同或相似的小问题来解决。递归算法的核心在于函数(或过程)能够直接或间接地调用自身来求解问题的不同部分,直到达到基本情况(也称为基础案例或终止条件),这时可以直接得出答案而不必再进行递归调用。
71 4
【刷题】 leetcode 面试题 08.05.递归乘法
|
6月前
|
算法 Java C++
刷题两个月,从入门到字节跳动offer丨GitHub标星16k+,美团Java面试题
刷题两个月,从入门到字节跳动offer丨GitHub标星16k+,美团Java面试题
|
6月前
|
消息中间件 前端开发 Java
java面试刷题软件kafka和mq的区别面试
java面试刷题软件kafka和mq的区别面试
|
6月前
|
机器学习/深度学习 人工智能 算法
LeetCode刷题--- 面试题 01.07. 旋转矩阵(原地旋转+翻转替旋转)
LeetCode刷题--- 面试题 01.07. 旋转矩阵(原地旋转+翻转替旋转)
|
6月前
|
存储 编译器 API
嵌入式笔试面试刷题(day12)
嵌入式笔试面试刷题(day12)
69 1
|
6月前
|
编译器 Linux C语言
嵌入式笔试面试刷题(day15)
嵌入式笔试面试刷题(day15)
116 0
|
6月前
|
存储 网络协议 调度
嵌入式面试笔试刷题(day14)
嵌入式面试笔试刷题(day14)
60 0
|
6月前
|
存储 网络协议 编译器
嵌入式面试笔试刷题(day13)
嵌入式面试笔试刷题(day13)
76 0
|
6月前
|
网络协议 安全 编译器
嵌入式笔试面试刷题(day11)
嵌入式笔试面试刷题(day11)
70 0
下一篇
无影云桌面