牛客网华为机考(HJ1~HJ10)

HJ1 字符串最后一个单词的长度

简单 通过率:34.26% 时间限制:1秒 空间限制:32M

知识点[字符串]

描述

计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)

输入描述:

输入一行,代表要计算的字符串,非空,长度小于5000。

输出描述:

输出一个整数,表示输入字符串最后一个单词的长度。

示例1

输入:hello nowcoder
输出:8
说明:最后一个单词为nowcoder,长度为8  

代码

//方法一
import java.util.Scanner;
//倒序遍历
public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        int length = str.length();
        int count = 0;
        for (int i = length - 1; i >= 0; i--) {
            if (str.charAt(i)==' ') { 
    // 或者 if (str.substring(i, i + 1).equals(" ")) {
                break;
            }
            count++;
        }
        System.out.println(count);
    }
}
//方法二
import java.util.Scanner;
import java.lang.*;
//字符串反转后正序遍历
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int count = 0;
        String str = sc.nextLine();
        StringBuilder sb = new StringBuilder(str);
        StringBuilder s = sb.reverse();
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == ' ') {
                break;
            }
            count++;
        }
        System.out.print(count);
    }
}

HJ2 计算某字符出现次数

简单 通过率:31.87% 时间限制:1秒 空间限制:32M

知识点[字符串、哈希]

描述

写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母)

数据范围:1≤n≤1000

输入描述:

第一行输入一个由字母和数字以及空格组成的字符串,第二行输入一个字符。

输出描述:

输出输入字符串中含有该字符的个数。(不区分大小写字母)

示例1

输入:ABCabc
	 A
输出:2

代码

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner s = new Scanner(System.in);
        String input1= s.nextLine();
        String input2 = s.nextLine();
        //将input1中的input2字符串全部替换为 “”
        String split3 = input1.toUpperCase().replaceAll(input2.toUpperCase(),"");
        //做减法得出出现次数
        System.out.println(input1.length() - split3.length());
    }
}

HJ3 明明的随机数

较难 通过率:23.25% 时间限制:1秒 空间限制:32M

知识点[数组]

描述

明明生成了N个1到500之间的随机整数。请你删去其中重复的数字,即相同的数字只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序输出。

数据范围: 1≤n≤1000 ,输入的数字大小满足1≤val≤500

输入描述:

第一行先输入随机整数的个数 N 。 接下来的 N 行每行输入一个整数,代表明明生成的随机数。 具体格式可以参考下面的"示例"。

输出描述:

输出多行,表示输入数据处理后的结果

示例1

输入:
3
2
2
1
输出:
1
2

说明:输入解释:
第一个数字是3,也即这个小样例的N=3,说明用计算机生成了3个1到500之间的随机整数,接下来每行一个随机数字,共3行,也即这3个随机数字为:
2
2
1
所以样例的输出为:
1
2     

代码

import java.util.Scanner;
//思路一:因为限定了数据范围是1000个数据以内,所以直接创建指定长度数组
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            //获取输入次数
            int num = sc.nextInt();
            //创建指定长度数组用于接收数据
            int[] arr = new int[1001];
            for(int i = 0; i < num; i++){
                //通过上面的输入次数循环输入
                int n = sc.nextInt();
                //每次输入的值作为下标来存储
                arr[n] = 1;
            }
            //因为是用输入值作为下标进行存储的,所以查询的时候要查询整个数组
            for(int i = 0; i < arr.length; i++){
                //只要数组值为1的下标就是我们存储的值,获取下标输出即可
                if(arr[i] == 1){
                    System.out.println(i);
                }
            }
        }
    }
}
import java.util.Scanner;
import java.util.TreeSet;
//思路二:采用了TreeSet的特点,有序不可重复性
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //获取个数
        int num = sc.nextInt();
        //创建TreeSet进行去重排序
        TreeSet Tset = new TreeSet();
        //输入
        for(int i =0 ; i < num ;i++){
            Tset.add(sc.nextInt());
        }
        //输出
        Iterator iterator = Tset.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

HJ4 字符串分隔

简单 通过率:29.86% 时间限制:1秒 空间限制:32M

知识点[字符串]

描述

•输入一个字符串,请按长度为8拆分每个输入字符串并进行输出;

•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。

输入描述:

连续输入字符串(每个字符串长度小于等于100)

输出描述:

依次输出所有分割后的长度为8的新字符串

示例1

输入:abc
输出:abc00000

代码

注意

(1)str.substring(i)意为截取从字符索引第i位到末尾的字符串。

(2)str.substring(i,j)意为截取索引第i位到第(j-1)位字符串。包含i,不包含j。

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            String str = sc.nextLine();
            while(str.length() >= 8){
                System.out.println(str.substring(0,8));
                str = str.substring(8);
            }
            if(str.length() < 8  && str.length() > 0){
                    str = str + "0000000";
                    System.out.println(str.substring(0,8));
                }
        }
    }
}

HJ5 进制转换2

简单 通过率:35.09% 时间限制:1秒 空间限制:32M

知识点[字符串]

描述

写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。

数据范围:保证结果在 1≤n≤231−1

输入描述:

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

输出描述:

输出该数值的十进制字符串。不同组的测试用例用\n隔开。

示例1

输入:0xAA
输出:170

代码

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        /**Integer.valueOf(String s, int radix): 返回一个 Integer 对象,
        *该对象中保存了用第二个参数提供的基数进行解析时从指定的 String 中提取的值。
        *也可以使用
        *Integer.parseInt 方法的作用, 就是从字符串转换成一个10进制的整数
		*Integer.parseInt(String s,int radix)
		*s代表需要转换的字符串
		*radix表示进制 , 如果是字符串代表的数字本来就是10进制, 那么可以省略radix参数
        */
        int a = Integer.valueOf(str.substring(2),16);
        System.out.print(a);
    }
}

HJ6 质数因子

简单 通过率:27.51% 时间限制:1秒 空间限制:32M

知识点[排序]

描述

功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )

数据范围: 1≤n≤2×109+14

输入描述:

输入一个整数

输出描述:

按照从小到大的顺序输出它的所有质数的因子,以空格隔开。

示例1

输入:180
输出:2 2 3 3 5

代码

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
       Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        for(int i = 2; i <= num; i++){
            while(num % i == 0){
                System.out.print(i + " ");
                num /= i;
            }
        }
    }
}
//这个代码只能通过一部分的测试用例,因为会有超大的素数作为特殊用例来导致你时间超时

因为特殊的超大素数导致的时间超时问题,我们想到了在判断

数 num 是不是质数时,没必要从 2 一直尝试到 num一样,此题中的大循环也大可不必写一个到 num 的循环,写到即可 √num (对num开根号),如果此时数字还没有除数,则可判定其本身是一个质数,没有再除下去的必要了,直接打印其本身即可:

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
       Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        for(int i = 2; i <= Math.sqrt(num); i++){
            while(num % i == 0){
                System.out.print(i + " ");
                num /= i;
            }
        }
         System.out.println(num == 1 ? "": num+" ");
    }
}
//这个代码只能通过一部分的测试用例,因为会有超大的素数作为特殊用例来导致你时间超时

HJ7 取近似值

入门 通过率:51.56% 时间限制:1秒 空间限制:32M

知识点[基础数学]

描述

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

数据范围:保证输入的数字在 32 位浮点数范围内

输入描述:

输入一个正浮点数值

输出描述:

输出该数值的近似整数值

示例1

输入:5.5
输出:6
说明:0.5>=0.5,所以5.5需要向上取整为6   

示例2

输入:2.499
输出:2
说明:0.499<0.5,2.499向下取整为2   

代码

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        double number = in.nextDouble();
        //因为java浮点数转整数时是一刀切,直接取整数部分,所以只要小数部分加上0.5就可以进位,形成四舍五入的效果
        System.out.println((int)(number + 0.5));
    }
}

import java.util.Scanner;
public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        double number = in.nextDouble();
        //Math中有round方法,作用是四舍五入
        //Math还有ceil表示向上取整. floor表示向下取整, round表示四舍五入.入参都是Double形
        System.out.println((int)Math.round(number));
    }
}

HJ8 合并表记录

简单 通过率:36.16% 时间限制:1秒 空间限制:32M

知识点[哈希]

描述

数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。

提示:

0 <= index <= 11111111

1 <= value <= 100000

输入描述:

先输入键值对的个数n(1 <= n <= 500)
接下来n行每行输入成对的index和value值,以空格隔开

输出描述:

输出合并后的键值对(多行)

示例1

输入:
    4
    0 1
    0 2
    1 2
    3 4
输出:
    0 3
    1 2
    3 4

示例2

输入:
    3
    0 1
    0 2
    8 9
输出:
    0 3
    8 9

代码

import java.util.Scanner;
import java.util.TreeMap;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        TreeMap<Integer,Integer> map = new TreeMap<>();
        while(sc.hasNext()){
            int n = sc.nextInt();
            for(int i = 0; i < n; i++){
                int key = sc.nextInt();
                int value = sc.nextInt();
                //hashmap.getOrDefault(Object key, V defaultValue)
                map.put(key,map.getOrDefault(key,0)+value);
            }
            for(Integer i : map.keySet()){
                System.out.println(i + " " + map.get(i));
            }
        }
    }
}
//方法二:
import java.util.*;
public class Main {
 public static void main(String agv[]) {
      Scanner scanner = new Scanner(System.in);
      int tableSize = scanner.nextInt();
      Map<Integer, Integer> table = new HashMap<>(tableSize);
      for (int i = 0; i < tableSize; i++) {
          int key = scanner.nextInt();
          int value = scanner.nextInt();
          if (table.containsKey(key)) {
              table.put(key, table.get(key) + value);
          } else {
              table.put(key, value);
          }
      }
       for (Integer key : table.keySet()) {
          System.out.println( key + " " + table.get(key));
      }
  }
}

注意:

1、hashmap.getOrDefault(Object key, V defaultValue)

返回 key 相映射的的 value,如果给定的 key 在映射关系中找不到,则返回指定的默认值。

2、hashmap.keySet()

返回映射中所有 key 组成的 Set 视图。

3、hashmap.containsKey(Object key) //这里是方法二的

如果 hashMap 中存在指定的 key 对应的映射关系返回 true,否则返回 false。

4、对于这类使用key-Value进行存储时要看清题目是否有要求排序,对于不同的map排序方式不同。

Hashtable.keySet()降序
TreeMap.keySet(升序
HashMap.keySet()乱序
LinkedHashMap.keySet()原序

HJ9 提取不重复的整数

入门 通过率:46.34% 时间限制:1秒 空间限制:32M

知识点[数组\哈希]

描述

输入一个 int 型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。

保证输入的整数最后一位不是 0 。

数据范围: 1≤n≤10^8

输入描述:

输入一个int型整数

输出描述:

按照从右向左的阅读顺序,返回一个不含重复数字的新的整数

示例1

输入:9876673
输出:37689

代码

import java.util.Scanner;
import java.util.HashSet;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        StringBuilder sbd = new StringBuilder(sc.nextLine()).reverse();
        //使用hashset去重
        HashSet hs = new HashSet();
        for(int i = 0; i < sbd.length(); i++){
            //通过使用 contains() 方法来判断元素是否存在于集合当中:
            //如果不在集合中就添加进去并输出
            if(!hs.contains(sbd.charAt(i))){
                hs.add(sbd.charAt(i));
                System.out.print(sbd.charAt(i));
            }
        }
    }
}
//方法二
import java.util.Scanner;
import java.util.HashSet;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        StringBuilder sbd = new StringBuilder(sc.nextLine()).reverse();
        HashSet hs = new HashSet();
        for(int i = 0; i < sbd.length(); i++){
            //直接用add方法,如果添加成功返回ture,添加失败返回false
            if(hs.add(sbd.charAt(i)){
                System.out.print(sbd.charAt(i));
            }
        }
    }
}

HJ10 字符个数统计

简单 通过率:49.60% 时间限制:1秒 空间限制:32M

知识点[字符串\哈希]

描述

编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次

例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3 。

数据范围:1≤n≤500

输入描述:

输入一行没有空格的字符串。

输出描述:

输出 输入字符串 中范围在(0~127,包括0和127)字符的种数。

示例1

输入:abc
输出:3

示例2

输入:aaa
输出:1

代码

import java.util.Scanner;
import java.util.HashSet;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        StringBuilder strb = new StringBuilder(sc.nextLine());
        HashSet hs = new HashSet();
        for(int i = 0; i < strb.length(); i++){
            hs.add(strb.charAt(i));
        }
        System.out.print(hs.size());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值