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

版权声明:本文为博主阿甘(Gane_Cheng)原创文章,欢迎转载,传播知识,请留言告知并注明出处,方便文章有误改正之后能找到原文。个人之言,请抱着怀疑的态度参考! https://blog.csdn.net/Gane_Cheng/article/details/52184215

转载请注明出处:

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]);
            }

        }
    }

}
阅读更多

没有更多推荐了,返回首页