华为校招软件上机考试题目解析

时间:2022-04-07 18:56:21

转载请注明出处:

http://blog.csdn.net/gane_cheng/article/details/52184215

http://www.ganecheng.tech/blog/52184215.html (浏览效果更好)

华为校招软件上机考试,技术岗需要软件上机考试。

总共三道题。

题目 分数 可以提交次数
回文数字判断 100 5
字符串排序 200 5
整数排序 300 5

第一题 回文数字判断

描述: 有这样一类数字,他们顺着看和倒着看是相同的数,例如:121,656,2332等,这样的数字就称为:回文数字。判断某数字是否是回文数字。
运行时间限制: 10 Sec
内存限制: 128 MByte
输入: 整型数字
输出: 0:不是回文数字;1:是回文数字。
样例输入: 121
样例输出: 1

解题思路:从头部和尾部比较,如果相同,则为回文数字,只要有一个不同,则不是回文数字。

import java.util.*;

public class Main
{

public static void main(String args[])
{
Scanner cin = new Scanner(System.in);
int a;
while (cin.hasNext())
{
a = cin.nextInt();
System.out.println(isPalindromeNumber(String.valueOf(a)) ? 1 : 0);
}
}

public static boolean isPalindromeNumber(String strIn)
{
if (strIn == null || strIn.length() < 1)
{
return false;
}

char[] numArr = strIn.toCharArray();

boolean isPalidromeNum = true;
for (int i = 0; i < numArr.length / 2; i++)
{
if (numArr[i] != numArr[numArr.length - 1 - i])
{
isPalidromeNum = false;
}
}

return isPalidromeNum;
}
}

第二题 字符串排序

描述: 输入一个字符串,对英文字母按照ASCII码排序,非英文字母保留原有的位置。输入字符串长度不超过100 。
运行时间限制: 无限制
内存限制: 无限制
输入: 字符串
输出: 排序后的字符串
样例输入: Wor#d
样例输出: Wdo#r

解题思路:先走一遍字符串,然后用一个数组存储出现的字母次数,然后替换掉原来的顺序。此方法在字符串超长的情况下,效果很好。


import java.util.*;

public class Main
{

public static void main(String args[])
{
Scanner cin = new Scanner(System.in);
String a;
while (cin.hasNext())
{
a = cin.next();
System.out.println(getAlphabetOrderString(a));
}
}

public static String getAlphabetOrderString(String strIn)
{
if (strIn == null || strIn.length() == 0)
{
return "";
}
char[] strArr = strIn.toCharArray();
int[] intArr = new int[58];

for (char c : strArr)
{
int tempNum = c - 'A';
if ((tempNum >= 0 && tempNum < 26) || (tempNum >= 32 && tempNum < 58))
{
intArr[c - 'A'] += 1;
}
}

int j = 0;

for (int i = 0; i < intArr.length; i++)
{
while (intArr[i] > 0)
{
while (j < strArr.length)
{
if (Character.isLetter(strArr[j]))
{
strArr[j++] = (char) (i + 'A');
intArr[i]--;
break;
}
else
{
j++;
}
}
}
}
return String.valueOf(strArr);
}
}

第三题 整数排序

描述: 实现输入一组大于等于0的整数,根据从小到大的顺序排序后输出,排序后有连续数时,只输出连续数中最小和最大的两个数。
运行时间限制: 无限制
内存限制: 无限制
输入: 一组大于等于0的整数,不考虑非法输入,各个整数之间以逗号(“,”)分隔, 输入字符串的总长度小于等于100个字节。
输出: 排序后的值,各个整数之间以空格分隔。
样例输入: 1,4,3,110,2,90,7
样例输出: 1 4 7 90 110

解题思路:先排序,然后输出首尾两个数字,然后中间的数字走一遍,如果和前后的数字不连续,直接输出,如果和前后的数字连续,继续向后遍历直到不连续,输出字符。


import java.util.*;

public class Main
{

public static void main(String args[])
{
Scanner cin = new Scanner(System.in);
String a;
while (cin.hasNext())
{
a = cin.next();
String[] intStrArr = a.split(",");
int[] intArr = new int[intStrArr.length];
for (int i = 0; i < intArr.length; i++)
{
intArr[i] = Integer.parseInt(intStrArr[i]);
}

Arrays.sort(intArr);

if (intArr.length == 0)
{
System.out.println("");
}
else if (intArr.length == 1)
{
System.out.println(intArr[0]);
}
else if (intArr.length == 2 && intArr[0] == intArr[1])
{
System.out.println(intArr[0]);
}
else
{
System.out.print(intArr[0] + " ");

for (int i = 1; i < intArr.length - 1; i++)
{

if ((intArr[i] == intArr[i + 1] - 1) && intArr[i] == intArr[i - 1] + 1)
{
continue;
}

System.out.print(intArr[i] + " ");

}

System.out.print(intArr[intArr.length - 1]);
}

}
}

}