您的位置:首页 > 职场人生

一道简单的String面试题-找出非连续成对出现的一个字母(临界情况)

2016-09-29 10:56 495 查看
给定一个字符串数组,所有字母都连续成对出现除了一个字母,找出该字母。

例子:[AABBCCDEEFFGG], 

答案: D

秒写简单算法,注意边界条件,遍历即可:

private static char findSingleCharacter1(char[] input, int n)  {
int i;
for (i = 0; i < n - 2; i = i +2) {
if (input[i] != input[i+1]) {
break;
}
}
return input[i];
}


那么,可不可以优化呢?借鉴一下其他算法?
必然可以,二分。

private static char findSingleCharacgter2(char[] input,  int n)  {
int start = 0, end = n;
while (start < end - 1) {
int mid = (end + start)/2;  // 下取整
System.out.println(input[mid]+"-"+mid);
if (input[mid] == input[mid-1]) {
start = mid + 1;
System.out.println("start:" + start);
} else {
end = mid;
System.out.println("end:" + end);
}
}
return input[start];
}

跑一下测例,通过~

然而并不能收工,别忘了临界情况。

果然,

方法二-修改版binary search在边界情况时会出错。

String testTwo = "ABBCCDDEEFFGG";

D-6

start:7

F-10

start:11

G-12

start:13

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 13

at quanTest.findSingleCharacterTest.findSingleCharacgter2(findSingleCharacterTest.java:41)

at quanTest.findSingleCharacterTest.main(findSingleCharacterTest.java:15)

String testThree = "AABBCCDDEEFFG";

D-6

end:6

B-3

start:4

C-5

start:6

D

建议在方法二中边界情况单独检查。

//边界单独判断:

if(input[0] != input[1])

return input[0];

if(input[n-1] != input[n-2])

return input[n-1];

最后完整Java源代码如下:

/*
* 权兴权意
* 给定一个字符串数组,所有字母都连续成对出现除了一个字母,找出该字母。
* 例子:[AABBCCDEEFFGG], 答案: D
*/

public class findSingleCharacterTest {

public static void main(String[] args) {
String testOne = "AABBCCDEEFFGG";
String testTwo = "ABBCCDDEEFFGG";
String testThree = "AABBCCDDEEFFG";
char input[] = testThree.toCharArray();
System.out.println(findSingleCharacgter2(input,input.length));
}

private static char findSingleCharacter1(char[] input, int n)  {
int i;
for (i = 0; i < n - 2; i = i +2) {
if (input[i] != input[i+1]) {
break;
}
}
return input[i];
}

private static char findSingleCharacgter2(char[] input,  int n)  {
//边界单独判断:
if(input[0] != input[1])
return input[0];
if(input[n-1] != input[n-2])
return input[n-1];

int start = 0, end = n;
while (start < end - 1) {
int mid = (end + start)/2;  // 下取整
System.out.println(input[mid]+"-"+mid);
if (input[mid] == input[mid-1]) {
start = mid + 1;
System.out.println("start:" + start);
} else {
end = mid;
System.out.println("end:" + end);
}
}
return input[start];
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐