欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

华为2018实习生软件岗机试题目(2018.04.10)

程序员文章站 2022-04-04 20:12:49
...

刚刚做完笔试题目,题目具体内容记得不是很清楚了,请见谅。一共三道题目,时间120分钟。

第一题

题目描述

输入一行字符串(字母或者数字,可能含重复值),按照其ASCII码顺序输出。

比如:

输入  

eeefffgghhk

次数统计

e —— 3次
f —— 3次
g ——2次
h —— 2次
k —— 1次

输出

efghkefghef

提交代码

import java.util.*;
public class Main{
public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();

        char[] charArray = input.toCharArray();
        //建立ASCII码数组,下标即对应的ASCII值
        int[] asciiArray = new int[127];
        //统计每个ASCII字符出现的次数
        for (int i = 0; i < charArray.length; i++) {
            asciiArray[charArray[i]]++;
        }

        StringBuilder sb = new StringBuilder();
        //标记位 如果数组所有次数减为0,则退出循环
        int zeroCount = 0;
        while (zeroCount != 127) {
            zeroCount = 0;
            for (int j = 0; j < asciiArray.length; j++) { //循环遍历已经实现了按照ASCII值排序
                if (asciiArray[j] != 0) {
                    char ch = (char) j;  //拿到当前位的字符
                    sb.append(ch);       //添加到输出
                    asciiArray[j]--;     //次数减一
                } else {
                    zeroCount++;
                }
            }
        }
        System.out.println(sb.toString());
    }
}

第二题

题目描述

输入多行数字,第一行数字代表加下来要输入的数字个数。每个数字的值代表其可以向后跳跃的最长长度,求从第一位跳到最后一位的最短步数。

比如:

输入

7 
2 
3
2
1
2
1
5

得到

2 3 2 1 2 1 5
输出
3
解析:最短路径为 2-2-2-5或者 2-3-2-5,都是跳3步到最后一位

解题思路

一看就是用回溯算法

import java.util.*;
public class Main{
    static int curStep = 0;
    static int minStep = 0;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();

        int[] nums = new int[num];

        for (int i = 0; i <  num; i++)
            nums[i] = scanner.nextInt();

        jumpToLast(nums, 0);

        System.out.println(minStep - 1);
    }

    private static void jumpToLast(int[] array, int curPosition) {
        //超过
        if (curPosition > array.length - 1) {
            return;
        }
        //刚好
        else if (curPosition == array.length - 1) {
            curStep++;  //向前
            if (minStep == 0 || curStep < minStep)
                minStep = curStep;  //更新最小步数
            curStep--;  //回退
            return;
        }
        //还没到尽头
        else{
            curStep++;  //向前
            for (int i = 1; i <= array[curPosition]; i++) {
                jumpToLast(array,curPosition + i);
            }
            curStep--;  //回退
        }
    }
}

第三题

题目描述

大整数(正数,位数不限)相乘,求乘积。输入两行字符串,输出乘积的字符串

比如:

输入

1234
4321
输出
5332114
解题思路

华为2018实习生软件岗机试题目(2018.04.10)

代码提交

import java.util.*;
public class Main{
 public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String num1 = scanner.nextLine();
        String num2 = scanner.nextLine();

        int len1 = num1.length();
        int len2 = num2.length();
        //新建一个数组用于存放结果,位数最多不超过totalLen
        int totalLen = len1 + len2;
        int[] resultArray = new int[totalLen];
        //存放进位
        int carry = 0;
        //在数组中的存放位置移动指针(初始为最高位)
        int index = totalLen - 1;
        for (int i = len1 - 1; i >= 0; i--){
            //遍历num1,从右侧(低位)开始
            int tempNum1 = num1.charAt(i) - '0';
            //遍历num2,每一位都与num1的当前位相乘
            for (int j = len2 - 1; j >= 0; j--) {
                int tempNum2 = num2.charAt(j) - '0';
                //每一次算和的时候都要加上原来在该位置处的值以及进位
                int sum = resultArray[i + j + 1] + tempNum1 * tempNum2 + carry;
                //进位
                carry = sum / 10;
                //新值
                resultArray[i + j + 1] = sum % 10;
            }
            //进位不为0,则需在数组中体现
            if (carry != 0)
                resultArray[i] = carry;
            //进位清零
            carry = 0;
        }

        StringBuilder sb = new StringBuilder();
        if (resultArray[0] != 0)
            sb.append(resultArray[0]);

        for (int k = 1; k < totalLen; k++) {
            sb.append(resultArray[k]);
        }

        System.out.println(sb.toString());
    }
}
花了一个半小时写完,感觉还是有点紧张,当时做这道题的时候,【进位】和【新值】那边的/号和%号就写反了。不过很开心都做出来了~~~