前几天,我感着冒去面试一家公司,经历笔试上机题、技术初试、部门经理初试、人事面试、技术总监复试(技术+笔试逻辑题:关于体彩投注和中奖最大金额)一连串的恶魔般面试流程,从1:30一直面到5:30,脑子一发懵,最后倒在了技术总监复试上,失败而告终。
附上笔试上机题:获取字符串中最大升序数字字符串,例如"AFD1248DW3239234T",最大升序数字字符串是“1248”
以下是我靠记忆重新编写该代码。(笔试时一开始感觉不太好写,还没考虑几个特殊情况,不过测试过程中修改了,前前后后刚好花45分钟,比较完美得写出来,经过了几个特殊情况的junit。现在重新编写代码,突然感觉这个题好容易,10分钟就写出来,还简化了代码逻辑)。
代码如下:
import java.util.ArrayList;
import java.util.List;
public class MaxOrderedNumberFinder {
/**
* 查找所有升序数字字符串
* @param str
* @return
*/
public List<String> findOrderedNumbers(String str) {
List<String> numbers = new ArrayList<String>();
if (str == null) {
return numbers;
}
char[] chars = str.toCharArray();
int preNumber = -1; // 前一个数字
String number = ""; // 完整的升序数字字符串
for (int i = 0, len = chars.length; i < len; i++) {
char charInt = chars[i];
if (charInt >= '0' && charInt <= '9') { // 是否是数字
if (charInt >= preNumber) { // 数字大于等于前一个数字,则为升序
number += ""+charInt;
preNumber = charInt;
} else { //数字小于前一个数字
if (!"".equals(number)) {
numbers.add(number);
}
number = ""+charInt;;
preNumber = charInt;
}
} else { // 不是数字
if (!"".equals(number)) {
numbers.add(number);
}
preNumber = -1;
number = "";
}
}
if(!"".equals(number)) {
numbers.add(number);
}
return numbers;
}
/**
* 查找出最大数字字符串
* @param numbers
* @return
*/
public List<String> findMaxNumbers(List<String> numbers) {
List<String> result = new ArrayList<String>();
if(numbers==null) {
return result;
}
long max = -1;
for (String number : numbers) {
long value = Long.valueOf(number);
if(max <value) {
max = value;
}
}
if(max==-1) {
return result;
}
for (String number : numbers) {
long value = Long.valueOf(number);
if(max == value) {
result.add(number);
}
}
return result;
}
public static void main(String[] args) {
String str = "AFD1248DW3239234T";
//String str = "121313";
MaxOrderedNumberFinder finder = new MaxOrderedNumberFinder();
List<String> numbers = finder.findOrderedNumbers(str);
System.out.println(numbers);
List<String> result = finder.findMaxNumbers(numbers);
System.out.println(result);
}
}