我正准备接受采访,其中一个问题就是:
提供一个句子(例如,歌曲是最好的歌曲),分为单词和单词的第一个字母的索引,即“the” - 0,12; “歌” - 4,21; “是” - 9; “最好的” - 16;选择一个数据结构来存储这些信息,并使用该数据结构重建该句子。
我的初始尝试涉及将单词存储在散列图中,其中键是单词,值是位置数组。这是完全可行的,但是在边界索引处嵌套for循环和恼人问题,在适当位置读取空格等等时会变得非常复杂。
我已经为它完成了代码,所以如果有人想看,我会发帖(这很长,并且会让人感到精力充沛!)
无论如何,对于我的问题:任何人都可以建议一种更有效的方式来表示和重建数据吗?我想尝试另一种方式,但这是我迄今为止所提出的所有方法
答案 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();
}
}
如果这不包含部分问题,请发表评论。我不确定我是否理解所要求的整个范围。