选择数据结构来存储句子中的单词及其起始位置

时间:2012-04-10 01:06:12

标签: java data-structures hashmap sentence

我正准备接受采访,其中一个问题就是:

提供一个句子(例如,歌曲是最好的歌曲),分为单词和单词的第一个字母的索引,即“the” - 0,12; “歌” - 4,21; “是” - 9; “最好的” - 16;选择一个数据结构来存储这些信息,并使用该数据结构重建该句子。

我的初始尝试涉及将单词存储在散列图中,其中键是单词,值是位置数组。这是完全可行的,但是在边界索引处嵌套for循环和恼人问题,在适当位置读取空格等等时会变得非常复杂。

我已经为它完成了代码,所以如果有人想看,我会发帖(这很长,并且会让人感到精力充沛!)

无论如何,对于我的问题:任何人都可以建议一种更有效的方式来表示和重建数据吗?我想尝试另一种方式,但这是我迄今为止所提出的所有方法

3 个答案:

答案 0 :(得分:1)

作为采访不同技能水平的候选人的人,我希望受访者在决定最终数据结构之前提出更多问题。

  • 数据是否专门用于重建句子?如果是这样,列表将更可取。
  • 你需要能够查找单词位置吗?如果是这样,你的结构就好了。
  • 您可能会对使用此数据的句子提出哪些其他问题?

一种选择是为每个单词创建一个WordPosition对象,其中包含单词,其位置和对下一个单词的引用。这些将形成一个链表,使得重构句子成为一个简单的有序遍历。将这些存储在地图中,并将单词作为键和每个单词的WordPosition列表。

答案 1 :(得分:0)

如何让键成为位置?那么你不需要使用数组。你可以使用树形图,然后积分器将按顺序返回标记。

答案 2 :(得分:0)

我在这里避免使用地图,因为这看起来太简单了。

class Sentence {
  String[] words;//Every word in the sentence
  int[][] word_positions;//{index into the word array,start position of that word in the sentence}

  String getSentence(){
    //Find the last position of the last character of the last word
    int length = word_positions[word_positions.length][1] 
                 + word[word_positions[word_positions.length][0]].length();
    //Allocate an appropriate sized array
    char[] sentence = new char[length];

    //Iterate through every word in the sentence, putting it into the correct place.
    for (int w=0; w<word_positions.length; w++){
      //figure out where in the array this word will start
      int start = word_positions[w][1];
      //get the word
      char[] word = words[wordpositions[w][0].toCharArray();
      //copy it into the master array at the correct position
      for (int letter=0; letter<word.length; letter++ ) {
        sentence[start+letter] = word[letter];
      }
    }

    return sentence.toString();
  }
}

如果这不包含部分问题,请发表评论。我不确定我是否理解所要求的整个范围。