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

刚刚做完笔试题目,题目具体内容记得不是很清楚了,请见谅。一共三道题目,时间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
解题思路


代码提交

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());
    }
}
花了一个半小时写完,感觉还是有点紧张,当时做这道题的时候,【进位】和【新值】那边的/号和%号就写反了。不过很开心都做出来了~~~
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值