【问题标题】:Java Searching through a String for a valid character sequenceJava 通过字符串搜索有效的字符序列
【发布时间】:2015-10-18 19:30:32
【问题描述】:

我刚参加了一个代码测试,想知道为什么我的解决方案只得分 37/100。问题是你得到了一个String 并且必须通过它搜索有效的密码。 规则如下:

1) 有效密码以大写字母开头,不能包含任何数字。输入限制为 a-z、A-Z 和 0-9 的任意组合。

2) 他们希望您创建的方法是假设返回最大有效密码的大小。因此,例如,如果您输入“Aa8aaaArtd900d”,则假设数字 4 由求解方法输出。如果没有找到有效的字符串,该方法应该返回 -1

我似乎无法弄清楚我的解决方案哪里出了问题。任何帮助将不胜感激!也非常感谢任何有关如何更好地测试此类代码的建议。

class Solution2 {
public int solution(String S) {
    int first = 0;
    int last = S.length()-1;
    int longest = -1;
    for(int i = 0; i < S.length(); i++){
        if(Character.isUpperCase(S.charAt(i))){
        first = i;
        last = first;
        while(last < S.length()){
                 if(Character.isDigit(S.charAt(last))){
                    i = last;
                    break;
                    }
                 last++;
            }    
        longest = Math.max(last - first, longest);
        }
     }
    return longest;    
 }
}

添加了更新的解决方案,有什么想法可以进一步优化吗?

【问题讨论】:

  • 你的代码给出的是什么而不是 4?
  • 我的代码确实返回了 4。由于某种原因,代码测试不喜欢我的答案。当我测试它时,它似乎工作正常。我的问题是关于程序失败的地方。该测试声称它仅适用于 37% 的测试用例。
  • 如果您正确缩进代码,可能更容易发现错误。
  • 抱歉,现在怎么样了?
  • 比我为你编辑它时更糟糕。提示:如果您在相邻行上有两个结束 } 具有相同的缩进,则说明您没有正确缩进。

标签: java string validation testing


【解决方案1】:

您的解决方案太复杂了。由于不要求您查找最长密码,只要求查找最长密码的长度,因此没有理由使用该最长密码创建或存储字符串。因此,您不需要使用substringStrings 的数组,只需使用int 变量。

寻找解决方案的算法很简单:

  1. 创建一个int pos = 0 变量,表示s 中的当前位置
  2. 循环搜索下一个候选密码
  3. 从位置pos开始,查找下一个大写字母
  4. 如果到达行尾,退出
  5. 从大写字母的位置开始,找到下一个数字
  6. 如果到达行尾,请停止
  7. 找出数字位置(或行尾)与大写字母位置之间的差异。
  8. 如果差值高于您之前找到的max,请将max 替换为差值
  9. 前进pos 到最后一个字母(或行尾)的位置
  10. 如果poss.length 之下,则在第2 步继续循环
  11. 返回max

Demo.

【讨论】:

  • 我明白你在说什么,但你并没有真正回答我最初的问题。我的算法和你的算法之间的唯一区别是你直接返回整数而不是拉出字符串并从新列表中找到最长的一个。查找有效密码的实现几乎相同。测试表明性能并不重要,只有获得正确的输出很重要。我只是想知道是什么特别导致我的代码在他们正在测试的输入上失败。
  • @PhilDiMarco 你的代码有最愚蠢的错误——当找不到密码时它返回-1而不是0。不过,我认为这是您的代码中最小的问题。更大的一个是很难阅读。例如,您查找数字的部分可以使用break 进行简化。
  • 问题要求 -1 输出没有有效密码,我应该将其包含在我的原始帖子中。感谢您的建议,使用休息更有意义!
猜你喜欢
  • 2014-10-12
  • 2012-01-29
  • 1970-01-01
  • 2018-08-08
  • 2010-12-23
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 2021-12-23
相关资源
最近更新 更多