Google Foo.Bar Challenge帮助Minion致敬

时间:2017-02-21 21:27:09

标签: java

我正在进行foo.bar挑战并且已经陷入困境。这是问题的描述:

> En Route Salute

兰达指挥官热爱效率,厌恶任何浪费时间的事情。毕竟,她是一只忙碌的羔羊!她慷慨地奖励那些找出低效率来源的追随者,并找到消除它们的方法。您已经发现了一个这样的来源,您认为解决它会帮助您建立升职所需的声誉。

每当指挥官的员工在大厅里互相通过时,他们每个人都必须停下来互相致敬 - 一次一个 - 然后才能恢复他们的路径。敬礼是五秒钟,所以每次交流致敬需要十秒钟(指挥官Lambda的致敬有点呃,参与其中)。您认为通过删除敬礼要求,您可以每天节省几个小时的员工时间。但首先,你需要向她展示问题的严重程度。

编写一个程序,计算沿着走廊进行典型步行时交换多少礼炮。大厅用绳子代表。例如: “---> - >< - >< - > - ”

每个走廊字符串将包含三种不同类型的字符:'>',一名员工走向右边; '<',一名走向左边的员工;和' - ',一个空的空间。每个员工根据他们的指示以相同的速度向右或向左行走。每当两名员工交叉时,他们每个人都向另一个员工致敬。然后他们继续走,直到他们到达终点,最后离开走廊。在上面的例子中,他们致敬了10次。

写一个函数答案,它带有一个表示员工走在走廊上的字符串,并返回员工敬礼的次数。 s将包含至少1个,最多100个字符,每个字符包含 - ,>或<。

示例输出:

>测试用例

输入:     (字符串)s =“> ----<” 输出:     (int)2

输入:     (字符串)s =“<<>><” 输出:     (int)4

我的代码到目前为止:

public class Minion_SalutesV1 {
public static void main(String[] args){
    //Test input
    System.out.println(answer("<-->-<--<>-<<-->--<-->"));
    System.out.println(answer("<<><>><>><<><>>>"));
    System.out.println(answer(">----<"));
    System.out.println(answer("<<>><"));
}
public static int answer(String s) {
    //Return a string starting at the first occurrence of '>' and end at the last occurrence of '<+1' 
    String empBound = s.substring(s.indexOf('>'), s.lastIndexOf('<')+1).replaceAll("-", "");
    //Isolate the number of employees walking right
    String rightSaluters = empBound.replaceAll("<", "");
    //Isolate the number of employees walking left
    String leftSaluters = empBound.replaceAll(">", "");
    if(empBound.length() == 2){
        return 2;
    }
    else if (empBound.length() == 3){
        return 4;
    }
    else
    return rightSaluters.length() * leftSaluters.length();
    }
}

我一直在尝试很多不同的事情,但尚未取得正确的结果。

我认为返回rightSaluters.length()* leftSaluters.length()会给我想要的结果。我觉得我有正确的想法,通过隔离右边和左边的傻瓜,但我失去了超过这一点。

如何正确计算妓女之间的致敬数量?

我是否应该为将要发生的遭遇次数设置一个变量,然后将该数字乘以2?我意识到我在这里喋喋不休,但是我已经把头骨绷紧了好几天,等到最后一刻才寻求帮助。

更新:尝试实施杰森的回答

public class Minion_SalutesV1 {
    public static void main(String[] args){
        //Test input
        System.out.println(answer("<-->-<--<>-<<-->--<-->"));
        System.out.println(answer("<<><>><>><<><>>>"));
        System.out.println(answer(">----<"));
        System.out.println(answer("<<>><"));
    }
    public static int answer(String s) {
        //Return a string starting at the first occurrence of '>' and end at the last occurrence of '<+1'
        String empBound = s.substring(s.indexOf('>'), s.lastIndexOf('<')+1).replaceAll("-", "");
        //Isolate the number of employees walking right
        String rightSaluters = empBound.replaceAll("<", "");
        //Isolate the number of employees walking left
        String leftSaluters = empBound.replaceAll(">", "");
        int saluters = rightSaluters.length()+leftSaluters.length();
        System.out.println(saluters);

        for(char c = '>'; c < rightSaluters.length(); c++){
            int count = leftSaluters.length();
            saluters = count*2;
        }
        return saluters * 2;
    }
}

输出:

8  //remove this
16
11 //remove this
22
2  //remove this
4
3  //remove this
6

所以看来每个字符串返回的最后一个整数是我需要的那个如何消除其他返回值?

4 个答案:

答案 0 :(得分:3)

关键是要认识到仆从只向在他们面前的其他仆人致敬并向他们走来。

计算致敬数量的算法是:

for each '>'
    count the '<' to its right
    add count to the running total
end for

output the running total * 2 (because 2 salutes per meeting)

编辑:这是实现我的算法的一种方法(不是最有效的代码,而是快速而又脏的第一次尝试):

public static void main(String[] args) {
    //Test input
    System.out.println(answer("<-->-<--<>-<<-->--<-->"));
    System.out.println(answer("<<><>><>><<><>>>"));
    System.out.println(answer(">----<"));
    System.out.println(answer("<<>><"));
}

public static int answer(String s) {

    int meetings = 0;

    for (int index = 0; index < s.length() - 1; index++) {    // stop one short of the end, since if the last minion is heading right, there won't be anyone in from of him
        if (s.charAt(index) == '>') {
            meetings += countApproachingMinions(s.substring(index + 1));
        }
    }

    return meetings * 2;
}

private static int countApproachingMinions(String hallwayAhead) {
    return hallwayAhead.replaceAll(">", "")    // ignore minions heading the same way
            .replaceAll("-", "")               // ignore spaces
            .length();                         // count the approaching minions
}

答案 1 :(得分:1)

一种更好的算法,只需要一次遍历整个字符串。

<div id="parent">

  <div draggable="true" id="child" ondragstart="dragStart(event)" ondrag="dragging(event)"></div>

</div>
<div id="demo"></div>

答案 2 :(得分:1)

这是另一种方式。如果将左右移动分成不同的字符串,然后将每个字符串表示为一个二进制数字,则可以使用按位和&,以及bit >> >>操作来模拟彼此传递的两行。

这是一个简单的python解决方案。请注意,python支持任意长度的int,因此,使用另一种语言,您可能必须引入“ big int”类才能使用此方法。

def answer(s):
    hall_length = len(s)
    hall = s.replace('-', '0')
    left = hall.replace('<', '1').replace('>', '0')
    right = hall.replace('>', '1').replace('<', '0')
    #convert binary strings to ints
    left = int(left, 2)
    right = int(right, 2)
    passes = 0
    for i in range(1, hall_length):
        p = left & (right >> i)#An int whos number of high bits represents the number of passes this step
        p = bin(p).count("1") #Convert to string and count the 1's
        passes = passes + p 
    return int(passes * 2)

答案 3 :(得分:0)

def solution(s):
    pas = 0
    salute = 0
    for x in range(s.find('>'),len(s)-s[::-1].find('<')):
        if(s[x] == '>'):
            pas+=1
        if(s[x] == '<'):
            salute += 2*pas
    return salute

说明

在上述代码解决方案中,它将从左到右处理字符串 并从左侧找到'>'和从右侧找到'<<的索引位置。

s.find('>'),len(s)-s[::-1].find('<')

< - > - > < - < - >
0 1 2 3 4 5 6 7 8 9
    ^         ^
在上面的字符串示例中,位置0和9的

奴才从不向其他人致敬。这样我们只处理索引2到7(从左到右)

如果字符串在当前位置为“>”,则增加 pas

if(s[x] == '>'):
    pas+=1

如果字符串在当前位置为“ <”,则将 pas 值乘以2,然后加上总敬礼数

if(s[x] == '<'):
    salute += 2*pas

循环完成后,敬礼值就是总数。致敬。

#Simulation of the code
< - | > - > < - < | - >
0 1 | 2 3 4 5 6 7 | 8 9
      ^     
current pos = 2
pas = 1
salute = 0

< - | > - > < - < | - >
0 1 | 2 3 4 5 6 7 | 8 9
        ^   
current pos = 3
pas = 1
salute = 0

< - | > - > < - < | - >
0 1 | 2 3 4 5 6 7 | 8 9
          ^   
current pos = 4
pas = 2 
salute = 0

< - | > - > < - < | - >
0 1 | 2 3 4 5 6 7 | 8 9
            ^ 
current pos = 5
pas = 2 
salute = 4  (0 += 2*2 / salute = 2*pas)

< - | > - > < - < | - >
0 1 | 2 3 4 5 6 7 | 8 9
              ^ 
current pos = 6
pas = 2 
salute = 4  (0 += 2*2 / salute = 2*pas)

< - | > - > < - < | - >
0 1 | 2 3 4 5 6 7 | 8 9
                ^ 
current pos = 7
pas = 2 
salute = 8  (4 += 2*2 / salute = 2*pas)