顺序遍历:求解《面试题 17.11. 单词距离》

2022-05-27 12:18:06
顺序遍历,求解《面试题 17.11. 单词距离》

例题

面试题 17.11. 单词距离

有个内含单词的超大文本文件,给定任意两个不同的单词,找出在这个文件中这两个单词的最短距离(相隔单词数)。如果寻找过程在这个文件中会重复多次,而每次寻找的单词不同,你能对此优化吗?
示例:
输入:words = ["I","am","a","student","from","a","university","in","a","city"], word1 = "a", word2 = "student"
输出:1

答案

顺序遍历

var findClosest = function(words, word1, word2) {
  const n = words.length
  let i1 = i2 = -1, r = Number.MAX_SAFE_INTEGER
  for (let i = 0; i < n; i++) {
    if (words[i] === word1) i1 = i
    else if (words[i] === word2) i2 = i
    if (i1 > -1 && i2 > -1) r = Math.min(r, Math.abs(i1 - i2))
  }
  return r
};
function findClosest(words: string[], word1: string, word2: string): number {
  const n = words.length
  let i1 = -1, i2 = -1, r = 100000
  for (let i = 0; i < n; i++) {
    switch(words[i]) {
      case word1:
        i1 = i
      break;
      case word2:
        i2 = i
      break;
    }
    if (i1 > -1 && i2 > -1) r = Math.min(r, Math.abs(i1 - i2))
  }
  return r
};
func findClosest(words []string, word1 string, word2 string) int {
  i1, i2, r := -1, -1, math.MaxInt64
  for i, word := range words {
    if word == word1 {
      i1 = i
    } else if word == word2 {
      i2 = i
    }
    if i1 > -1 && i2 > -1 {
      r = min(r, int(math.Abs(float64(i1 - i2))))
    }
  }
  return r
}
func min(a int, b int) int {
  if a < b {
    return a
  }
  return b
}
func findClosest(words []string, word1 string, word2 string) int {
  i1, i2, r := -1, -1, math.MaxInt64
  for i, word := range words {
    if word == word1 {
      i1 = i
    } else if word == word2 {
      i2 = i
    }
    if i1 > -1 && i2 > -1 {
      r = min(r, int(math.Abs(float64(i1 - i2))))
    }
  }
  return r
}
func min(a int, b int) int {
  if a < b {
    return a
  }
  return b
}
class Solution {
  public int findClosest(String[] words, String word1, String word2) {
    int i1 = -1;
    int i2 = -1;
    int r = Integer.MAX_VALUE;
    for (int i = 0; i < words.length; i++) {
      if (words[i].equals(word1)) i1 = i;
      else if (words[i].equals(word2)) i2 = i;
      if (i1 > -1 && i2 > -1) r = Math.min(r, Math.abs(i1 - i2));
    }
    return r;
  }
}
class Solution(object):
  def findClosest(self, words, word1, word2):
    i1, i2, r = -1, -1, sys.maxint
    for i, word in enumerate(words):
      if word == word1: i1 = i
      elif word == word2: i2 = i
      if i1 > -1 and i2 > -1: r = min(r, abs(i1 - i2))
    return r
class Solution:
  def findClosest(self, words: List[str], word1: str, word2: str) -> int:
    i1, i2, r = -1, -1, sys.maxsize
    for i, word in enumerate(words):
      if word == word1: i1 = i
      elif word == word2: i2 = i
      if i1 > -1 and i2 > -1: r = min(r, abs(i1 - i2))
    return r

顺序遍历,正则:2 解法求解《468. 验证IP地址》
顺序遍历,正则,2 解法求解《468. 验证IP地址》
栈、计数:2 解法求解《1021. 删除最外层的括号》
栈、计数,2 解法求解《1021. 删除最外层的括号》
顺序遍历:求解《1669. 合并两个链表》
顺序遍历,求解《1669. 合并两个链表》