华为机试在线训练

1.

题目描述计算字符串最后一个单词的长度,单词以空格隔开。 

输入描述:一行字符串,非空,长度小于5000。

输出描述:整数N,最后一个单词的长度。

解题思路:首先获取系统输入,使用Scanner类。当有输入时,获取输入字符串,将字符串按照空格拆分并保存至数组中。然后计算数组最后一个元素的length.

import java.util.Scanner;

public class Main1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextLine()) {
            String s = scanner.nextLine();
            System.out.println(lengthOfLast(s));
        }
    }

    private static int lengthOfLast(String str) {
        String[] strings = str.split(" ");
        return strings[strings.length - 1].length();
    }
}

2.

题目描述:写出一个程序,接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。

输入描述:输入一个有字母和数字以及空格组成的字符串,和一个字符。

解题思路:首先使用Scanner类nextline()方法获取输入字符串并使用toUpperCase()方法将字符串全部转为大写(题目中要求不区分大小写)。然后用Scanner类next()方法获取最后输入的字符。

补充知识点:next() 与 nextLine() 区别

next():

1、一定要读取到有效字符后才可以结束输入。

2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。

3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。

next() 不能得到带有空格的字符串。

nextLine():

1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。

2、可以获得空白。

所以此题中应使用next获取最后输入的字符。

import java.util.Scanner;


public class Main2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String string =scanner.nextLine().toUpperCase();
        char target = scanner.next().toUpperCase().toCharArray()[0];
        int count = 0;
            for (int i=0; i<string.length(); i++) {
                if (string.charAt(i) == target) count ++;
            }
            System.out.println(count);
    }
}

3.

题目描述:写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。(多组同时输入 )

输入描述:输入一个十六进制的数值字符串。

输出描述:输出该数值的十进制字符串。

解题思路:字符串前两位为十六进制0x,然后用parseInt()方法。parseInt() 方法用于将字符串参数作为有符号的十进制整数进行解析。如果方法有两个参数, 使用第二个参数指定的基数,将字符串参数解析为有符号的整数。 (基数可以是 10, 2, 8, 或 16 等进制数)。

 

6.

题目描述:功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 )最后一个数后面也要有空格

详细描述:
函数接口说明:

public String getResult(long ulDataInput)

输入参数:

long ulDataInput:输入的正整数

返回值:

String

输入描述:输入一个long型整数

输出描述:按照从小到大的顺序输出它的所有质数的因子,以空格隔开。最后一个数后面也要有空格。

解题思路:链接:https://www.nowcoder.com/questionTerminal/196534628ca6490ebce2e336b47b3607来源:牛客网

好多人没明白这个问题的意思,其实就是让你把输入的整数因式分解,只不过因子必须都是质数

例如:180 = 2 * 2 * 3 * 3 * 5;90 = 2 * 3 * 3 * 5;而不是找出所有的质数因子

import java.util.Scanner;


public class Main6 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextLong()) {
            long number = scanner.nextLong();
            System.out.println(getResult(number));

        }
    }

    private static String getResult(long ulDataInput) {
        StringBuffer strbf = new StringBuffer();
        long num = ulDataInput;
        while (num != 1 ) {
            for (int i=2; i<= num; i++) {
                if (num % i == 0) {
                    strbf.append(i + " ");
                    num /= i;
                    break;
                }
            }
        }
        return strbf.toString();
    }

}

 

7.

题目描述:写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于5,向上取整;小于5,则向下取整。

输入描述: 输入一个正浮点数值

输出描述: 输出该数值的近似整数值

解题思路:来源牛客网;得到输入的Double值后将其强制转换为整数。Double值减去整数如果大于等于0.5,则其小数点后数值大于等于5;小于0.5,则直接输出整数。

package com.example;

import java.util.Scanner;

/**
 * Created by Zhans on 2018/8/22.
 */

public class Main7 {
    public static void main (String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextDouble()) {
            Double aDouble = scanner.nextDouble();
            System.out.println(getReturn(aDouble));
        }
    }

    public static int getReturn(double num) {
        int i = (int) num;
        return (num - i) >= 0.5 ? i + 1 : i;
    }
}

8.

题目描述:数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。

输入描述:先输入键值对的个数,然后输入成对的index和value值,以空格隔开

输出描述:

解题思路:首先思考使用什么数据结构存放给定的键值对。这里使用TreeMap.(不要问我为什么能想到TreeMap,因为我也没想到,是看到大神的思路,~(@^_^@)~)。先得到输入的键值对个数的整数值,使用Scanner.nextInt()方法。然后判断是否还有输入,如果有则新建TreeMap对象新输入的键值,然后使用TreeMap.containsKey(key)判断是否存在此键,如果存在,将值合并,并存入。题目要求按升序输出,使用TreeMap的put(K key, V value)方法在每添加一个元素时,都会自动排序,这样便省去了排序的过程【这是使用TreeMap 的原因吗?】,然后使用for循环输出。

<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值