一起养成写作习惯!这是我参与「掘金日新计划 · 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,说明用计算机生成了3个1到500之间的随机整数,接下来每行一个随机数字,共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);
}
}