华为2012上机考试 (2012-09-15 16:01:18)
标签: 杂谈
编程题(共3题)
注意:
1、请上机编写程序,按题目要求提交文件。[详见考试说明,点击进入考试说明]
2、本试题采用自动执行测试用例进行评分,测试用例不对考生公开
3、评卷通过在给定用例输入下,严格按照试题要求比较考生实现函数的输出与预设输出。两者相同则得分,不同则不得分。
4、评卷人保证测试用例输入参数的合法性,考生不用考虑输入参数非法或异常的情况,题目中注明的例外
5、评卷人保证测试用例输入在被测函数正常合法情况下使用不会导致程序错误
6、如果考生函数异常导致程序崩溃或死循环,则自动评卷可能会被人为终止,剩余用例不被执行,无法得分
7、基于上述阅卷规则,请考生严格按照题目要求功能实现程序,尽量保证实现函数的稳健性,同时建议完成一道题并调试保证正确性后,再考虑并实现下一题目
1. 逆序
问题描述:
将一个字符串中的大写字母顺序颠倒过来,并输出。字符串的长度不超过100个字符。
要求实现函数:
String stringReverse(String input)
【输入】input:输入的字符串
【输出】output:输出转换好的逆序字符串
举例:
输入input=“I am A stUdent”,输出output=“UAI”
2. 数字膨胀
问题描述:
将输入字符串基于如下规则生成新的一字符串,注意,仅处理字符串中的数字:对数字进行膨胀操作:
第一轮膨胀,从第一位开始,从左到右,数字每一位都膨胀为相同的两位数字,其中已经有连续两位相同的数字不做膨胀操作;
第二轮膨胀,以第一轮膨胀后的字符串为基础,从第一位开始,从左到右,数字每两位都膨胀为相同的四位数字,其中已经有连续四位相同的数字不做膨胀操作。
要求实现函数:
String number_double(String inputStr, int time)
【输入】inputStr:输入的字符串
time:需要进行膨胀的次数
【输出】output:输出结束游戏后的字符串
注:输入数字串总是有效数字,膨胀次数不超过两次;
示例
输入:input = 1aa222 ,time = 1,输出output = 11aa2222
输入:input = 1a2a34,time =2, 输出 output = 1111a2222a33334444
3. 字符串替换
问题描述:
在一个字符串中查找一个包含通配符的字符子串并将其替换为另外一个子串,请编写函数实现这个功能。子串中包含的通配符仅有“*”和“?”,“*”可匹配0个或多个任意字符,“?”能且只能匹配任意一个字符。
要求实现函数:
String replace(String src, String subsrc, String replace)
【输入】 src,源字符串
subsrc,查找子串
replace,替换的子串
【输出】 out,替换后的子串
注:如未找到子串,就将源串直接输出。
示例
1) 输入:src = “abcdef” ,subsrc = “a?c”, replace= “cc”
输出:result = “ccdef”
2) 输入:src = “asdrcws” ,subsrc = “cws”, replace= “ztyf”
3) 输出:result = “asdrztyf”
package huawei.interview;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HuaTestDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
String input = "1a2a34 ";
int time = 2;
String src = "asdrcws";
String subsrc = "cws";
String replace= "ztyf";
HuaTestDemo hTestDemo = new HuaTestDemo();
System.out.print(hTestDemo.number_double(input, time));
System.out.print(hTestDemo.replace(src, subsrc, replace));
}
public String StringReverse(String input)
{
if (input.length() == 0 || input.length() > 100) {
return null;
}
ArrayList aList = new ArrayList();
for (int i = 0; i < input.length(); i++) {
if (input.charAt(i) >= 'A' && input.charAt(i) <= 'Z') {
aList.add(input.charAt(i));
}
}
StringBuffer sBuffer = new StringBuffer();
for (int i = aList.size() - 1; i >= 0; i--) {
sBuffer.append(aList.get(i));
}
String output = new String(sBuffer);
return output;
}
public String number_double(String inputStr, int time)
{
int inputLen = inputStr.length();
if (inputLen == 0)
{
return null;
}
if (time <= 0 || time >=3)
{
return inputStr;
}
//以下是输入有字符,且time大于0小于3
char[] chars = inputStr.toCharArray();
StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < chars.length; i++)
{
sBuilder.append(chars[i]);
if (chars[i]<='9' && chars[i]>='1')
{
if (time == 1)
{
if (i+1<inputLen && chars[i+1]!= chars[i])
{
sBuilder.append(chars[i]);
}
else if (i+1 == inputLen) {
sBuilder.append(chars[i]);
}
}
else if (time == 2)
{
if (i+1<inputLen && chars[i+1]!= chars[i])
{
sBuilder.append(chars[i]);
sBuilder.append(chars[i]);
sBuilder.append(chars[i]);
}
else if (i+1 == inputLen) {
sBuilder.append(chars[i]);
}
}
}
}
return new String(sBuilder);
}
String replace(String src, String subsrc, String replace)
{
if (subsrc.length() == 0 || src.length() == 0)
{
return null;
}
String ruleRegex = new String();
char[] chars = subsrc.toCharArray();
for (int i = 0; i < chars.length; i++)
{
if (chars[i] == '*')
{
ruleRegex = ruleRegex + "(.)+";
}
else if (chars[i] == '?') {
ruleRegex = ruleRegex + "(.)";
}else {
ruleRegex = ruleRegex + chars[i] + "";
}
}
Pattern p = Pattern.compile(ruleRegex);
Matcher m = p.matcher(src);
StringBuilder sBuilder = new StringBuilder();
while (m.find())
{
sBuilder.append(m.group());
}
if (sBuilder.length() == 0)
{
return null;
}
String oldString = new String(sBuilder);
return src.replace(oldString, replace);
}
}