2012-04-10 13 views
1

我准备面试,那往往会拿出一个问题是这样的:选择一个数据结构存储在一个句子中的单词和其起始位置

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

我最初的尝试是将单词存储在散列表中,其中键是单词,值是位置数组。这是完全可行的,但在嵌套for循环和边界索引恼人的问题,在适当的位置等空间读取变得相当复杂。

我有代码为它做,所以如果有人想看我会发布(它很长,使铆接阅读!!)

无论如何,对我的问题:任何人都可以提出一个更有效的方式来表示和重建数据?我很想尝试另一种方式,但这是我到目前为止所做的所有

+0

这可能不是一个好问题,因为它不符合'这是意见问题'测试。但是,您可以通过改写问题和/或张贴伪代码来获得更好的结果。 – 2012-04-10 01:12:55

+0

如果重复这些词怎么办?你必须记下所有的位置吗? – noMAD 2012-04-10 01:20:51

+0

@noMAD:是的,在我上面的例子中,“the”发生在位置0和12,“song”位于位置4和21等。使用这个信息,我必须重构句子 – cash22 2012-04-10 02:21:54

回答

1

作为一个面试不同技能水平的应聘者,我希望受访者在决定最终数据结构之前提出更多问题。

  • 数据将专门用于重建句子吗?如果是这样,一个清单将是可取的。
  • 你需要能够查找单词位置?如果是这样,你的结构很好。
  • 你可能会问关于使用这些数据的句子的其他问题吗?

一种选择是为每个单词创建一个WordPosition对象,每个单词包含该单词,其位置和对下一个单词的引用。这些将形成一个链表,使重建句子成为一个无关紧要的遍历。将这些文件按照您在地图中的使用方式进行存储,并将每个单词的词作为键和列表WordPosition s。

+0

我想我只是拿面值信息(信息来自先前完成面试的人)。显然,单词和索引以表格形式呈现。我认为他们必须保持这种格式,即词是关键,职位是价值观。如果我们能够改变这种情况,那么它会使事情变得容易很多 - 可以使用索引作为关键字(它们将是唯一的),也可以按照您的建议 - 关联词汇表 – cash22 2012-04-10 02:24:40

+0

关键是提出问题,因为这表明质量访调员看起来很重要为候选人。如果答案是“您必须使用地图”,则使用地图。如果你不问,它表明你根据有限的数据做出假设。 – 2012-04-10 04:14:36

+0

在这里发帖已经让我明白地看到提问是关键。感谢您的建议...希望它能够得到回报 – cash22 2012-04-10 10:08:32

0

如何让键位置?然后你不需要使用arrays.and你可以使用树形图,那么集成商将依次返回令牌。

+0

我肯定会这样来处理它if我并没有假设这个词必须与一系列指数特别关联。在面试的情况下,我肯定会要求澄清这一点 – cash22 2012-04-10 02:28:23

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(); 
    } 
} 

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

+1

首先,什么样的'for循环'是那样的?其次,你的代码到底在干什么?你如何将句子标记为单词并存储它们? – noMAD 2012-04-10 01:44:20

+0

@noMAD这个问题不包括询问单词是如何标记的,只是一些存储和重构数据的方案。我会更多地评论代码! – 2012-04-10 01:46:29

+0

@Nathaniel:这或多或少是我自己编写的,尽管我没有使用二维数组,而是使用了一个散列表,其中的值是一个数组。不知道选择对效率等有什么影响,但我们在重构句子方面有相同的方法。 – cash22 2012-04-10 02:37:16

相关问题