一道简单的String面试题-找出非连续成对出现的一个字母(临界情况)
2016-09-29 10:56
495 查看
给定一个字符串数组,所有字母都连续成对出现除了一个字母,找出该字母。
例子:[AABBCCDEEFFGG],
答案: D
秒写简单算法,注意边界条件,遍历即可:
那么,可不可以优化呢?借鉴一下其他算法?
必然可以,二分。
跑一下测例,通过~
然而并不能收工,别忘了临界情况。
果然,
方法二-修改版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
秒写简单算法,注意边界条件,遍历即可:
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]; } }
相关文章推荐
- [面试题] 用最快的方法找到唯一一个不连续成对出现的字母
- 编写一个小程序,从标准输入读入一系列string对象,寻找连续重复出现的单词。程序应该找出满足一下条件的单词:该单词的后面紧接着再次出现自己本身。跟踪重复次数最多的单词及其重复次数,输出.
- 一道迅雷面试题:求出一个字符串中每个字母出现的次数
- 面试题——找出1000个连续数中出现的一个重复数
- 给一段字符串,找出其中出现次数最多的字母及出现的次数(出现最多次数的项只有一个的情况)
- 一道迅雷面试题:求出一个字符串中每个字母出现的次数
- 编写一个小程序,从标准输入读入一系列string对象,寻找连续重复出现的单词。程序应该找出满足一下条件的单词:该单词的后面紧接着再次出现自己本身。跟踪重复次数最多的单词及其重复次数,输出.
- 一道迅雷面试题:求出一个字符串中每个字母出现的次数
- 找出一个字符串里面出现最多次数的字母以及次数
- 【面试题】找出字符串中连续出现次数最多的子串
- AS3 面试题35 在一个字符串中找出第一个只出现一次的字符
- 一个数组中,存在两个只出现一次的数字,其余的数字均出现两次。要求在时间复杂度o(n),空间复杂度为o(1)的情况下找出这两个数字
- 最新的微软面试题,题目:求一个字符串中连续出现次数最多的子串
- 一个简单的实现找出数组中一个数字出现次数最多的数字的算法
- 一道笔试题,去除首尾空白符,中间若有连续空格则保留一个,若出现换行则保留一个换行
- 所谓微软面试题的解答:求一个字符串中连续出现次数最多的子串
- 一道google面试题--自然数e中出现的连续的第一个10个数字组成的质数
- 面试题:求一个字符串中连续出现次数最多的子串
- 给定一个单向链表(长度未知),请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。实现这个算法,并为可能出现的特例情况安排好处理措施。“倒数第m个元素”是这样规定的:当m=0时,链表的
- (bitmap)给定一个字符串数组,从中找出第一个只出现一次的字母