Java 坑槽固定机

Java 坑槽固定机,java,algorithm,Java,Algorithm,我最近研究了一个在线问题,但没有提供答案,然而,我想知道我哪里出错了。提示很奇怪,但我会尽力解释: 有一台机器可以修复道路上3个单位长的所有坑洞。道路单位将用字符串中的句点表示。例如,“…”=一段道路长度为3个单位。坑洞在道路上用“X”标记,也算作长度单位。任务是走一条长度为N的路,用机器修复的尽可能少的路段修复所有坑洞。这个问题与性能而不是正确性有关 示例1:由“.X”表示的道路需要1个固定点 示例2:由“.X…X”表示的道路需要2个修复 示例3:“XXX.XXXX”表示的道路需要3次修复

我最近研究了一个在线问题,但没有提供答案,然而,我想知道我哪里出错了。提示很奇怪,但我会尽力解释:

有一台机器可以修复道路上3个单位长的所有坑洞。道路单位将用字符串中的句点表示。例如,“…”=一段道路长度为3个单位。坑洞在道路上用“X”标记,也算作长度单位。任务是走一条长度为N的路,用机器修复的尽可能少的路段修复所有坑洞。这个问题与性能而不是正确性有关

  • 示例1:由“.X”表示的道路需要1个固定点
  • 示例2:由“.X…X”表示的道路需要2个修复
  • 示例3:“XXX.XXXX”表示的道路需要3次修复
我的方法(如下所示)是一次以3个字符的增量计算字符串的各个部分。如果该序列包含一个“X”,那么它需要一个修复,反之亦然。为了解释长度不是3的倍数的道路,我只保留了序列读数并检查了剩下的部分。我也不知道如何使程序性能更好(除了用StringBuilder替换序列字符串)

公共类解决方案{
//注意:我不得不从内存中重新编写,因为在线问题检查器没有把它还给我
公共整数解决方案(字符串S){
int=0;
String sequence=“;//是否可以使用StringBuilder?
对于(inti=0;i
我认为这对于所要求的内容来说已经足够好了,并且它通过了所有给定的示例字符串,但在审查时显然失败了。我不知道我做错了什么,尽管我觉得我可能遗漏了一些小而愚蠢的东西

更新:

我确实错过了一些明显的东西,我需要从第一个“X”开始阅读,比如:

        if (S.charAt(i) == 'X') {//Start counting at the first X
            for (int j = 0; j < 3; j++) {//Count 3 chars at once
                if (i + j <= S.length() - 1) {//no outofbounds exceptions please!
                    sequence += S.charAt(i + j);//Add said Chars to our sequence
                }
            }
        }
if(S.charAt(i)='X'){//从第一个X开始计数
对于(int j=0;j<3;j++){//一次计算3个字符

如果(i+j您的程序只读取3个单位的路段。它可能会对某些配置给出错误的答案

例如,对于
.X.X…
,它将回答“2”,而这条道路只能在一次修复中修复

它将读取
.X
.X.
..
,当它应该一直读取到第一个
X
,忘记之前的内容,然后在继续之前修复3个单元


它应该读为
X.X
,当凹坑与这些分割不对齐时,将字符串分成3组将失败。有时机器最好跳过1或2个单位,或4或5个单位——一些数字不是3的倍数

例如,考虑这条路:

.X.XX.XX.X
您的算法将声明需要修复4个段:

|.X.|XX.|XX.|X|
但它可以分为三个部分:

.|X.X|X.X|X.X|
它传递了所有给定的示例字符串

但是…怎么做

你的代码完全错了。它怎么能传递示例字符串呢?那么一定是一些非常不幸的示例

这可以归结为:如果它是
“XXX”
,则增量
修复了

这不可能触发。想想看

你的代码所做的就是用一种复杂的方式计算坑洞

我认为这对于所要求的已经足够好了

您犯了3个主要错误。如果这是一项作业练习,则每个错误都可能足以导致严重降级:

  • 当问题明确指出性能很重要时,代码包含性能失误(在循环中使用
    +
    连接字符串)。您必须指出并解释您为什么故意违反经验法则,至少是这样

  • 直接的代码根本不起作用

  • 即使您修复了它,代码仍然不起作用。例如,输入
    “.X.X…”
    。正确的答案是1。即使您修复了代码,并且正确地处理了3块中的每一块(而不是由于
    j
    i
    之间的混乱而一次处理一块),你的算法返回2。这个问题比你想象的要复杂一点。没什么大不了的,记住。不过,编写的整个算法应该扔进垃圾箱,重新开始。不要从编程开始。从解决问题开始,考虑所需的算法。然后才开始编码

这是正确的算法。只是略图,仔细思考问题:

只要扫描一个坑洞。一旦你找到一个,修复它,然后跳过接下来的2个单位的道路,而你在那里。他们只是不要紧。如果他们有坑洞,我们将免费修复他们和我们发现的洞

这就是你所需要做的。只需数一数坑洞,忽略我们修复的坑洞右侧1或2的坑洞

在这里:

public int解决方案(字符串s){
int孔=0;
对于(int i=0;i

这段代码简单得多,正确得多,而且速度显然是前所未有的。

这不是问题所在。编辑了我的答案。可能是@JohnKugel
.|X.X|X.X|X.X|
for (int j = 0; j < 3; j++) {//Count 3 chars at once
  sequence += S.charAt(i);//Add said Chars to our sequence
 }
if (sequence.contains("X")) {//Check for potholes
  fixes++;//We can fix everything in this sequence
  sequence = "";//reset our sequence
}
if (sequence.contains("X")) {//Check anything left, since not all roads are multiples of 3
               fixes++;
           }
public int solution(String s) {
  int holes = 0;
  for (int i = 0; i < s.length(); i++)
    if (s.charAt(i) == 'X') {
      holes++;
      i += 2;
    }
  }
  return holes;
}