我刚刚进行了一次Codility测试,想知道为什么我的解决方案仅获得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;
}
}
添加了更新的解决方案,是否有进一步优化的想法?
最佳答案
您的解决方案太复杂了。由于不要求您找到最长的密码,而只是找到最长的密码的长度,因此没有必要使用最长的密码来创建或存储字符串。因此,您不需要使用substring
或String
的数组,只需使用int
变量。
查找解决方案的算法很简单:
创建一个int pos = 0
变量以表示s
中的当前位置
循环搜索下一个候选密码
从位置pos
开始,找到下一个大写字母
如果您到达了行尾,请退出
从大写字母的位置开始,找到下一个数字
如果您到达了行尾,请停止
找到数字位置(或行尾)与大写字母位置之间的差异。
如果差异大于先前找到的max
,请用差异替换max
将pos
移至最后一个字母(或行尾)的位置
如果pos
在s.length
下,则继续执行步骤2的循环
返回max
。
Demo.
关于java - Java通过字符串搜索有效的字符序列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33202253/