- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我针对新毕业生软件工程师职位面试的 Hackerrank 编码挑战:
拼图之前和之后
给定一个短语列表,生成一个命运之轮“之前和之后”谜题列表。 “之前和之后”谜题是指一个短语以另一个短语的第一个单词的最后一个单词结尾的情况。作为一个基本示例,给定两个短语“writing code”和“coderocks”,输出将是“writing coderocks”。这是输入和预期输出的更全面的示例。
输入 = [ “使命声明”, “快点吃点东西”, “一个模子出来的”, “巧克力吧”, “不可能完成的任务”, “一个肩负使命的人”, “区 block 党”, “吃掉我的话”, “一 block 肥皂”]
输出 = [ “快点吃掉我的话”, “旧街区派对的一小部分”, “巧克力肥皂”, “一个有使命声明的人”, “一个执行不可能任务的人”]
限制:- 返回的结果不必是唯一的- 不用担心外壳。假设输入只是 a - z 带空格的小写字母(因此没有特殊字符或处理大小写匹配的单词)- 假设所有空白都是单个空格(无需担心空白间距边缘情况)
我通过完成 6/7 个测试用例解决了这个问题,其中最后一个测试用例由于超时而终止。
// 1. Submitted code during the interview (cleared 6/7 test-cases)
/*
My approach: Compare every phrase in the list to every other phrase in the list.
If the last word of the phrase matches the first word of another phrase, do the
following:
1) Remove the first word from the other phrase.
2) Combine both phrases
3) Add the combined phrase to the output list.
*/
private static List<String> generate_phrases(List<String> phrases) {
List<String> output = new ArrayList<>();
for(String temp: phrases) {
String[] content = temp.split(" ");
for(String temp2: phrases) {
String[] content2 = temp2.split(" ");
if(content[content.length-1].equals(content2[0])) {
String tempWord = content2[0];
temp2 = temp2.replaceAll(tempWord, "");
output.add(temp+temp2);
}
}
}
return output;
}
// 2. Improved code after the interview
/*
My approach: Compare every phrase in the list to every other phrase in the list.
If the last word of the phrase matches the first word of another phrase, do the
following:
1) Push both phrases to a set.
2) Remove the first word from the other phrase.
3) Combine both phrases
4) Add the combined phrase to the output list.
5) for all phrases added in the set, decrease the size of the input list by removing the visited phrases
*/
private static List<String> generate_phrases(List<String> phrases) {
List<String> output = new ArrayList<>(); boolean flag = false;
int length = phrases.size();
for(int i=0; i<length; i++) {
Set<String> wordsToRemove = new HashSet<>();
String temp = phrases.get(i);
String[] contents1 = temp.split(" ");
for(int j=0; j<length; j++) {
String temp2 = phrases.get(j);
String[] contents2 = temp2.split(" ");
if(contents1[contents1.length-1].equals(contents2[0])) {
flag = true;
wordsToRemove.add(temp); wordsToRemove.add(temp2);
String tempWord = contents2[0];
temp2 = temp2.replaceAll(tempWord, "");
output.add(temp+temp2);
}
}
if(flag) {
for (String s : wordsToRemove){ phrases.remove(s); length--; }
flag = false; i=0;
}
}
return output;
}
我提交了第一段代码,但最后一个测试用例失败并因超时而终止。这是我在面试过程中能做的最好的事情。面试后花了一些时间,我想出了一个有效的解决方案,比之前的迭代次数更少。但我所有的解决方案都使用 2 个 for 循环。有人可以帮助我编写更好、更高效的代码吗?
按照我帖子中评论中的方法,我想出了一个解决方案。但还是不知道这样是否会更有效率。现在我的代码的时间复杂度是多少?
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("mission statement");
list.add("a quick bite to eat");
list.add("a chip off the old block");
list.add("chocolate bar");
list.add("mission impossible");
list.add("a man on a mission");
list.add("block party");
list.add("eat my words");
list.add("bar of soap");
System.out.println(generate_phrases(list));
}
private static List<String> generate_phrases(List<String> phrases) {
List<Phrase> phraseList = generatePhraseList(phrases);
Map<String, List<Phrase>> map = generateHashMapOfUniqueKeys(phraseList);
return generateOutputList(map);
}
private static List<Phrase> generatePhraseList(List<String> phrases) {
List<Phrase> phraseList = new ArrayList<>();
for (String p: phrases) {
Phrase temp = new Phrase(p);
phraseList.add(temp);
}
return phraseList;
}
private static Map<String, List<Phrase>> generateHashMapOfUniqueKeys(List<Phrase> phraseList) {
Map<String, List<Phrase>> map = new HashMap<>();
for(Phrase p : phraseList) {
String start = p.getStart();
if(!map.containsKey(start)) {
List<Phrase> temp = new ArrayList<>();
temp.add(p);
map.put(start, temp);
} else {
map.get(start).add(p);
}
}
return map;
}
private static List<String> generateOutputList(Map<String, List<Phrase>> map) {
List<String> output = new ArrayList<>();
for(List<Phrase> list: map.values()) {
for(Phrase p: list) {
String keyToBeSearched = p.getEnd();
if(map.containsKey(keyToBeSearched)) {
List<Phrase> temp = map.get(keyToBeSearched);
for(Phrase p2: temp) {
output.add(p.getWhole()+" "+p2.getMiddle());
}
}
}
}
return output;
}
}
class Phrase {
private final String start;
private final String middle;
private final String end;
private final String whole;
public Phrase(String initial) {
this.whole = initial;
String[] words = initial.split(" ");
this.start = words[0];
this.middle = Arrays.stream(words, 1, words.length).collect(joining(" "));
this.end = words[words.length - 1];
}
public String getStart() {
return this.start;
}
public String getMiddle() {
return this.middle;
}
public String getEnd() {
return this.end;
}
public String getWhole() {
return this.whole;
}
}
最佳答案
可能值得封装收集拆分操作的结果,以便不需要多次重复:
class Phrase {
private final String start;
private final String middle;
private final String end;
public Phrase(String initial) {
String[] words = initial.split(" ");
start = words[0];
middle = Arrays.stream(words, 1, words.length).collect(joining(" "));
end = words[words.length - 1];
}
public boolean matches(Phrase other) {
this.end.equals(other.start);
}
public String combine(Phrase other) {
assert matches(other);
return Stream.of(this.start, this.middle, this.end, other.middle, other.end)
.collect(joining(" "));
}
}
然后你的生成代码就变得非常简单:
List<Phrase> phrases = Arrays.stream(inputPhrases).map(Phrase::new).collect(toList());
return phrases.stream()
.flatMap(ph1 -> phrases.stream().filter(ph1::matches).map(ph1::combine))
.collect(toList());
我不确定这是否更有效,但我的猜测是,对于小输入,它的效率会较低,而对于大输入,它的效率会更高。如果您的硬件可以利用多个执行线程,您还可以使流并行以利用多个执行线程。
关于java - "Before and After"谜题有更好的解决方案吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55977249/
这个问题在这里已经有了答案: With arrays, why is it the case that a[5] == 5[a]? (20 个答案) 关闭 7 年前。 我正在尝试解开这个谜团: in
很难为这个问题找到合适的标题。欢迎编辑! :) 这是我的来源xml代码: [color hex] [color hex] [color he
编辑:看起来像一个索引问题,在问题底部更新 我有以下查询 + 子查询,其结果我无法解释。我从这个最小的输入数据集开始(这里的应用程序正在捕获数据变化,PK 是 id + tx_id)。 mysql>
基本上,我在这里试图实现的是让全局变量具有指向结构的指针数组,其大小在编译时是未知的——在我下面的示例中,它是 my_struct **tab。在最终版本中,我想调用一个 JNI 方法来初始化我的指针
所以我想弄清楚这个谜题: function fun1(){ var result = []; for (var i = 0; i < 5; i++){ result.p
一群 child 围成一圈。选择第一个 child ,他们从那个 child 开始顺时针计数,直到达到固定数字(n,在游戏开始时给出)。当计数达到 n 时,第 n 个位置的 child 被淘汰。游戏从
(我是 JS 新手,所以请耐心等待)我正在使用 table 来构建滑动益智游戏。我需要一个可以扰乱值的函数,但我不确定应该如何让它显示在表格单元格中。现在我的代码只是按顺序显示数字。 我有两个函数 -
我有一个 UserForm,xForm,它在类模块(假设为 TestClass)中实例化为: 'TestClass Dim Form as New xForm Private WithEvents E
如果没有循环或游标,如何获取日期间隔列表并将它们转换为 1 和 0 的字符串,这样: 每一位代表从 min(所有日期)到 max(所有日期)的每一天 如果该天属于任何日期间隔,则该位为 1 如果该天不
我读过很多A*算法的伪代码,但它们都没有真正解释如何输出解。我相信我理解使用优先级队列表示尚未访问的内容和使用已探索的表的概念,但是当我执行该算法时,我不知道在什么时候打印出结果。有没有人有一个伪代码
以下两个查询不会返回相同的结果。为什么? 注意 :我发现这个问题是一个 Mysql 难题,我没有关于这个问题的更多数据? SELECT table1.* FROM table1 LEFT JOIN t
如果您对我应该如何在 python 中执行以下任务有任何建议,我正在徘徊:假设我有以下类(class): class A(object): self._classes = [] def
我很难理解如何在不引起内存分配问题的情况下解决这个问题。我很确定我的逻辑是合理的,但不幸的是,这似乎还不够好。有没有人对此有任何建议,以便我了解如何更有效地编写代码? 问题来了:示例输入:1个5 2
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
所以这是一个难题: “kb”是扩展 java.util.Hashtable 的类的实例键是一个字符串,存储的值是一个名为“IntelCard”的类 此代码提取 key ,并尝试从表中打印数据
我有以下难题要解决,但我不确定我该怎么做。它说: 有一个 Ubuntu Linux C 程序可以输出变量的地址。 v1: 0xa156128 v2: 0xff97410c v3: 0xf750e34b
我有一个简单的 HTML 页面如下:- Col1 Col2
大家好, 我尝试了八个难题的解决方案发布 here由 joel Neely 玩弄并修改它,以便可以用来解决更高的网格[将网格的字符串表示更改为二维整数表示并修改相应的逻辑]。然而,修改后的代码可以解决
我正在尝试解决下文详述的 projecteuler 难题。我当前的函数适用于数字 1 到 10,但是当我尝试 1 到 20 时,它会一直循环下去而没有结果。 2520 is the smallest
我在为基于图 block 的游戏编写随机关卡生成器时遇到了一个有趣的问题。我已经为它实现了一个强力求解器,但它的速度呈指数级下降,而且绝对不适合我的用例。我不一定要寻找完美的解决方案,我会对性能良好的
我是一名优秀的程序员,十分优秀!