华为机试刷题笔记

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

描述

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

示例1

输入:

hello nowcoder

输出:

8

说明:

最后一个单词为nowcoder,长度为8   
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String nem = in.nextLine();
        String[] arr = nem.split(" ");
        System.out.println(arr[arr.length-1].toCharArray().length);
    }
}

HJ2 计算某字符出现次数

描述

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

输入:

ABCabc
A

输出:

2
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        char[] arr = in.nextLine().toCharArray();
        char a = in.nextLine().charAt(0);
        int count = 0;
        for(char s : arr){
            if(Character.toLowerCase(s) == Character.toLowerCase(a)){
                count++;
            }
        }
        System.out.println(count);
    }
}

 HJ3 明明的随机数

描述

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

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

示例1

输入:

3
2
2
1

输出:

1
2

说明:

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

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        TreeSet<Integer> set = new TreeSet<>();
        while (in.hasNext()) { 
            int n = in.nextInt();
            for (int i = 0; i < n; i++) {
                set.add(in.nextInt());
            }
            for (Integer a : set) {
                System.out.println(a);
            }
        }
    }
}

HJ4 字符串分隔

描述

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

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

示例1

输入:

abc

输出:

abc00000
import java.util.Scanner;

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

HJ5 进制转换

描述

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

数据范围:保证结果在 1 \le n \le 2^{31}-1 \1≤n≤231−1 

输入:

0xAA

输出:

170
import java.util.Scanner;
import java.math.BigInteger;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) { 
            String str = in.next().substring(2);
            System.out.println(Integer.parseInt(str,16));
        }
    }
}

HJ6 质数因子

描述

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

数据范围: 1 \le n \le 2 \times 10^{9} + 14 \1≤n≤2×109+14 

示例1

输入:

180

输出:

2 2 3 3 5

思路分析

  1. 质数,素数:除本身的绝对值外、不可能为大于1的整数除尽的数
  2. 因子:如果整数A除B,得出结果是没有余数的整数,就称B是A的因子。比如8的因子有1,2,4和8。
  3. 质数因子:整数A的因子里面的质数,某一正整数的质因子是,能整除该数的质数整数。
  4. 分解质因数:就是质因子相乘,乘起来正好等于合数。常用的是短除法,比如18,先除以最小的"可以整除当前数的质因数"18/2=9,然后再除以9最小的质因数9/3=3,3本身就是质数,没有其它质因子了。因此18的分解质因数为18=2 * 3 * 3
  5. 可以使用短除法
  6. 同理:180/2 = 90,90/2 = 45,45/3 = 15,15/3 = 5,5本身为质数,没有其它质因子了,因此180 = 2 * 2 * 3 * 3 * 5;
  7. 因此,根据这道题给的说明,要求的就是分解质因数
  8. 判断一个数num是否是质数时,如果判断到√num还没有找到可以整除num的数,这可以中断了,因为num肯定是一个质数
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int k = (int)Math.sqrt(n);
        for(int i = 2;i<=k;i++){
            while(n%i == 0){
                System.out.print(i + " ");
                n /= i;
            }
        }
        System.out.print(n == 1 ? " ": n + " ");
    }
}

HJ7 取近似值

描述

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

示例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 a = in.nextDouble();
        long b = Math.round(a);
        System.out.println(b);
    }
}

HJ9 提取不重复的整数

描述

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

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

数据范围: 1 \le n \le 10^{8} \1≤n≤108 

示例1

输入:

9876673

输出:

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

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String s = sc.nextLine();
            HashSet<Object> hashSet = new HashSet<>();
            for (int i = s.length() - 1; i >= 0; i--) {
                if (!hashSet.contains(s.charAt(i))) {
                    hashSet.add(s.charAt(i));
                    System.out.print(s.charAt(i));
                }
            }
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值