牛客刷题1

160 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天。

牛客网,华为机试刷题第一天

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

描述

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

输入描述:

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

输出描述:

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

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

思路

  • 控制台输入
  • 调用字符串的split()方法,按照指定内容划分,添加到String[] s 数组
  • 定义计数器
  • 判断:
    • 如果只有一个单词,那数组s长度为1,直接输出该单词长度
    • 如果多个单词,取最后一个单词就是s[s.length-1]的长度
    • 如果输入为空,直接返回
import java.util.Scanner; //导入工具类
public class Main{
    public static void main(String args[]){
        Scanner scanner = new Scanner(System.in); //输入单词
        String sc = scanner.nextLine(); //读取输入内容,转换为字符串格式
        String s[] = sc.split(" "); //以空格为条件划分字符串
        int len = 0;
        if(s.length == 0){
            return null;
        }else if(s.length == 1){
            len=str.length();
        }else{
            len = s[s.length - 1].length();
        }
        System.out.println(len)
      
    }
}

HJ2 计算某字符出现次数

描述

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

数据范围: 1≤n≤1000

输入描述:

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

输出描述:

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

输入:ABCabc
A
输出:2

思路

  • 控制台输入
  • 转换为String,遍历进入数组s
  • 不区分大小写,所以全部转换为小写
  • for循环判断和最后一个输入相同的元素出现的次数
  • 打印
import java.util.*;
 public class Main{
     public static void main(String[] args){
         Scanner scanner = new Scanner(System.in); //输入
         String sc = scanner.nextLine().toLowerCase(); //第一行转为小写
         String s = scanner.nextLine().toLowerCase(); //第二行转为小写
         int l = sc.length() - sc.replaceAll(s,"").length(); 
         //用replaceAll()进行替换,将第一行中包含第二行的内容换成“”,然后相减
         System.out.println(l);
     }
 }

HJ3 明明的随机数

描述

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

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

输入描述:

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

输出描述:

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

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

思路

  • 输入
  • 将输入的排序,转为数组存储
  • 打印第一个数,然后依次后边一个和前边一个比较,不重入就输出
import java.util.*;

public class Main{
     public static void main(String[] args){
         Scanner scanner = new Scanner(System.in); //输入
         while(scanner.hasNext()){ //hasNext判断是否还有输入的数据
             int count = scanner.nextInt(); //随机数总数
             //scanner调用nextInt()方法输入一个整数到count里
             int[] data = new int[count]; //定义一个长度为count的数组
             for(int i = 0;i<count;i++){ 
                 data[i] = scanner.nextInt(); //随机生成一个介于0-in的随机数,输入到数组里
             }
             Arrays.sort(data); //库函数排序
             System.out.println(data[0]); //打印第一个
             for( int i= 1;i<count;i++){
                 if(data[i] != data[i-1]){ //如果下一个数和前边的数不重复,打印出来
                     System.out.println(data[i]);
                 }
             }
         }
     }
 }

HJ4 字符串分隔

描述

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

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

输入描述:

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

输出描述:

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

输入:
abc
输出:
abc00000

思路

  • 输入字符串Scanner sc = new Scanner(System.in);
  • 转为String类型,String scc = sc.nextLine();
  • 对所有的字符串开始对8取余, 使用StringBuilder中的append()函数进行字符串修改,别忘了toString()。
  • 输出是,截取前8位进行输出
import java.util.*;

public class Main{
    public static void main(String arg[]){
        Scanner sc = new Scanner(System.in); //控制台输入
        while(sc.hasNext()){ //判断是否还有输入
            String str = sc.nextLine(); //转String类型
            StringBuilder sBuilder = new StringBuilder(); //字符缓冲区
            sBuilder.append(str); //str加入字符缓冲区
            int len = str.length();
            int add0 = 8 - len%8; //对8取余,再减去,得到需要添0的个数
            while((add0>0)&&(add0<8)){ //注意边界,
                sBuilder.append("0"); //将
                add0--;
            }
            String str1 = sBuilder.toString();
            while(str1.length()>0){
                System.out.println(str1.substring(0,8)); //输出前8位
                str1=str1.substring (8); //截取从字符串第8位到末尾的字符串
            }
        }
    }
}

HJ5 进制转换

描述

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

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

输入描述:

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

输出描述:

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

输入:
0xAA
输出:
170
import java.util.*;

//16进制的表示 0x(0x是固定写法)数字或者字母(A-F)可以是小写,英文字母A,B,C,D,E,F分别表示数字10~15。
//16进1,
//例如:0xAF=175 的十进制如下:
//    相当于 10*16¹ + 15*16º = 160 +15 =175

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in); //输入
        String s = sc.nextLine(); //转String
        String ss = s.substring(2); //截取第二位到最后
        int n = ss.length(); //数的长度
        int j = 1;
        int sum = 0;
        Map<Character , Integer> map = new HashMap<>();
        map.put('0' , 0);
        map.put('1' , 1);
        map.put('2' , 2);
        map.put('3' , 3);
        map.put('4' , 4);
        map.put('5' , 5);
        map.put('6' , 6);
        map.put('7' , 7);
        map.put('8' , 8);
        map.put('9' , 9);
        map.put('A' , 10);
        map.put('B' , 11);
        map.put('C' , 12);
        map.put('D' , 13);
        map.put('E' , 14);
        map.put('F' , 15);
        for(int i = n - 1 ; i >= 0 ; i--){
            int h = map.get(ss.charAt(i)); //charAt() 方法用于返回指定索引处的字符
            sum += h * j;
            j *= 16;
        }
        System.out.println(sum);
    }
}