牛客网华为机试题(持续更新)
1 计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。
解题思路:找到最后一个空格的下标,然后用输入的字符串长度减去空格的下标,再减1
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
//输入一整行
String line=scanner.nextLine();
//找到最后一个空格的下标
int i = line.lastIndexOf(' ');
//一整行字符串的长度
int length = line.length();
//用字符串的长度-(空格的下标+1),因为下标是从0开始的
System.out.println(length-i-1);
}
}
2 计算字符个数
写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字母,然后输出输入字符串中该字母的出现次数。不区分大小写,字符串长度小于500。
解题思路:1 先将所有字符串改成小写。2 需要求出次数的字符用 “”代替 3 求出替换前后的字符串的长度之差
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
//输入
String line=scanner.nextLine();
//将line中所有的字符转成小写
String lowerLine = line.toLowerCase();
//将输入的字符也改成小写
String target=(scanner.next()).toLowerCase();
//输入字符改用""替代 这里直接是英文状态下的双引号,中间无空格
String temp = lowerLine.replace(target,"");
//两个字符串的长度之差,即为目标需要的长度
System.out.println(lowerLine.length()-temp.length());
}
}
3 明明的随机数
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作(同一个测试用例里可能会有多组数据(用于不同的调查),希望大家能正确处理)。
注:测试用例保证输入参数的正确性,答题者无需验证。测试用例不止一组。
当没有新的输入时,说明输入结束。
分析:
输入一个数字N,代表输入数字的最大数量。
题目很长,但是实质是数字的去重和排序。利用Treeset的特性进行排序和去重
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public class Main{
public static void main(String [] args){
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
//代表第一行输入的随机整数N
int N=scanner.nextInt();
// 新建一个空的TreeSet
Set<Integer> set=new TreeSet<Integer>();
// 将新输入的数字加入到treeSet里面
for(int i=0;i<N;i++){
set.add(scanner.nextInt());
}
set.forEach(n->{
System.out.println(n);
});
}
}
}
4 字符串分隔
题目描述
连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组;
•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
解题思路:用StringBuilder对象操作前后不产生新对象的特性来处理
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
while(in.hasNext()){
String str = in.nextLine();
//构造新的StringBuilder对象,参数为输入的String 对象
StringBuilder sb = new StringBuilder(str);
while (sb.length() > 8){
//当sb的长度大于8时,打印前8个字符
System.out.println(sb.substring(0, 8));
//删掉前8个字符(delete的参数是左闭右开),如果长度还是大于8,继续循环,否则进入下一步
sb.delete(0, 8);
}
//如果长度小于8,就给sb后面添加“0”,直到长度==8
while (sb.length() > 0 && sb.length() < 8){
sb.append("0");
}
if(sb.length() == 8) System.out.println(sb);
}
}
}
5 进制转换
输入十六进制的数字,输出对应的十进制数
解题思路:用Integer.decode方法进行进制转换
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
while(scanner.hasNext()){
String line = scanner.nextLine();
//使用Integer.decode方法直接进行进制转换
System.out.println(Integer.decode(line));
}
}
}
6 质数因子
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
//用平方根简化取值范围
long num=scanner.nextLong();
long count=(long)Math.sqrt(num);
for(long i=2;i<=count;++i){
//当输入的数字可以被2整除时,输出2 同时数字变成除以2的商值,然后继续除以2,直到不能被2整除,然后条件++
while(num%i==0){
System.out.print(i+" ");
num =num/i;
}
}
//直到num为1的时候不再输出
System.out.println(num==1 ? " ":num+" ");
}
}
7 取近似值
写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于5,向上取整;小于5,则向下取整。
解题思路:四舍五入,Math.round方法
8 合并表记录
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()){
int next = sc.nextInt();
// 新建TreeMap
TreeMap<Integer,Integer> map = new TreeMap<>();
for (int i = 0; i < next; i++) {
int key = sc.nextInt();
int value = sc.nextInt();
if (map.containsKey(key)){
map.put(key,map.get(key)+value);
}else {
map.put(key,value);
}
}
for (Map.Entry<Integer, Integer> integerIntegerEntry : map.entrySet()) {
System.out.println(integerIntegerEntry.getKey()+" "+integerIntegerEntry.getValue());
}
}
}
}
9 提取不重复的数字
输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
保证输入的整数最后一位不是0。
解题思路:1 将输入的int类型数字转换成字符串2由于是反转“数字,那么最后连续的数字必然不可以是连续的0 3”在2的基础上用StringBuilder的reserve方法将字符串反转 4去重复 5 遍历输出
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int next = sc.nextInt();
String s = next + "";
StringBuilder sb = new StringBuilder(s);
while (sb.charAt(sb.length() - 1) == '0') {
sb.delete(sb.length() - 1, sb.length());
}
sb.reverse();
String str = sb.toString();
char[] chars = str.toCharArray();
List<Character> list=new ArrayList<>();
for (int i = 0; i < chars.length; i++) {
if (!list.contains(chars[i])){
list.add(chars[i]);
}
}
list.forEach(n->{
System.out.print(n);
});
}
}
## 10 统计不同字符的种类数量
编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次
例如,对于字符串abaca而言,有a、b、c三种不同的字符,因此输出3
解题思路
1 将输入的字符串转换成char数组。
2 对数组进行遍历,将char类型的元素转换成对应的数字
3 如果满足条件 字符在ACSII码范围内且 list集合中不含有该元素,就将数组内符合条件的元素放入到list集合里面
4 最后输出list集合的size
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
String s=scanner.next();
char[] chars = s.toCharArray();
List<Character> lis=new ArrayList<>();
for (int i = 0; i < chars.length; i++) {
int a=(int)chars[i];
if (a>0&&a<127){
if (!lis.contains(chars[i])){
lis.add(chars[i]);
}
}
}
System.out.println(lis.size());
}
}
