华为OD面试题练习(代码题部分)

华为OD算法题练习(牛客网)

  准备面试华为外包德科,记录一下一些面试题;
牛客网代码提交的坑,可以看一下下面的第一道题,ide本地编译通过,牛客网死活不通过,提交代码提示:返回非0。原因分析
  查询得知,结果非零的意思的代码退出的时候不是以正常的0退出的,而是非0状态,也就是代码出错了百思不得其解,到底为什么?平常写函数的时候,遇到特定条件,直接return返回,那return后面的代码将不会被执行,看到有一个C++代码网友反馈说return会被牛客网shell提交框替换成print,意思是会给你重新编排一次。这时候return就会出问题,return后面的代码会继续执行。
  所以个人建议写代码不要写方法,直接写在main方法内部就行了。

题目记录:

一、计算字符串最后一个单词的长度,单词以空格隔开。

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

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

/**
 * Created by chens
 * Date: 2021/1/18
 */

import java.util.Scanner;

/**
 * 华为机试题1
 * 原型:
 * 计算字符串最后一个单词的长度,单词以空格隔开。
 */
public class Main{
     
    public static void main(String[] args) {
     
        Scanner scanner = new Scanner(System.in);
        int stinglength = getStinglength(scanner.nextLine());
        System.out.println(scanner.nextLine());
        System.out.println(stinglength + "");
    }

    /**
     * * 输入描述:
     * * 输入一行,代表要计算的字符串,非空,长度小于5000。
     * * 输出描述:
     * * 输出一个整数,表示输入字符串最后一个单词的长度。
     *
     * @param inputstring
     * @return
     */
    public static int getStinglength(String inputstring) {
     
        //排除最后一个字符是空格的情况
        if (inputstring.charAt(inputstring.length() - 1)==' '){
     
            inputstring= inputstring.substring(0, inputstring.length() - 1);
        }
        System.out.println(inputstring);
        //数组反向输出字符串,计算最后一个单词的长度
        int con = 0;
        char[] chars = inputstring.toCharArray();
        for (int i = chars.length - 1; i > 0; i--) {
     
            if (chars[i] != ' ') {
     
                con++;
            } else {
     
                return con;
            }
        }
        return 0;
    }
}

第一次通过测试不成功,原因是写了return方法,可能是我的一个习惯,不喜欢直接写在main方法里面,喜欢单独写一个方法调用。后面进行了代码的修改,并且换了一种更简单的字符串charAt方法的使用

public class Main{
     
   public static void main(String[] args) {
     
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        //排除最后一位是空格的情况
        if (str.charAt(str.length() - 1) == ' ') {
     
            str = str.substring(0, str.length() - 1);
        }

        String[] split = str.split(" ");
        int length = split[split.length - 1].length();
        System.out.println(length);
    }
    }

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

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

输出描述:
输出输入字符串中含有该字符的个数。

import java.util.Scanner;

/**
 * Created by chens
 * Date: 2021/1/18
 */
public class test2 {
     
    public static void main(String[] args) {
     
        Scanner scanner = new Scanner(System.in);
        //获取字符,并转换为小写字母
        String str = scanner.nextLine().toLowerCase();
        String str1 = scanner.nextLine().toLowerCase();
        String replace = str.replace(str1, "");
        int i = str.length() - replace.length();
        System.out.println(i);
    }
}

三、明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作(同一个测试用例里可能会有多组数据,希望大家能正确处理)。

注:测试用例保证输入参数的正确性,答题者无需验证。测试用例不止一组。

当没有新的输入时,说明输入结束。

输入描述:
注意:输入可能有多组数据。每组数据都包括多行,第一行先输入随机整数的个数N,接下来的N行再输入相应个数的整数。具体格式请看下面的"示例"。

输出描述:
返回多行,处理后的结果

输入
3
2
2
1
11
10
20
40
32
67
40
20
89
300
400
15
输出
1
2
10
15
20
32
40
67
89
300
400

说明
样例输入解释:
样例有两组测试
第一组是3个数字,分别是:2,2,1。
第二组是11个数字,分别是:10,20,40,32,67,40,20,89,300,400,15。

import java.util.*;
/**
 * @author chens
 * Date: 2021/1/18
 */
public class Test3 {
     
    public static void main(String[] args) {
     
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
     
            int num = sc.nextInt();
            TreeSet set = new TreeSet();
            for (int i = 0; i < num; i++) {
     
                set.add(sc.nextInt());
            }
            Iterator iterator = set.iterator();
            while (iterator.hasNext()) {
     
                System.out.println(iterator.next());
            }
        }
    }
}

中途遇到一次意外,把输出循环语句写在while方法外面,编译不通过,不知道为什么,感觉牛客的代码校验问题还很大。

四、连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组;长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。

输入描述:
连续输入字符串(输入多次,每个字符串长度小于100)
abc
123456789
输出描述:
输出到长度为8的新字符串数组
abc00000
12345678


import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @author chens
 * Date: 2021/1/19
 */
public class Test4{
     

   public static void main(String[] args) {
     
        Scanner scanner = new Scanner(System.in);
        String s = "";
        int length = 8;
        while (scanner.hasNext()) {
     
            s = s + scanner.nextLine();
            while (s.length() > 8) {
     
                System.out.println(s.substring(0,8));
                s = s.substring(8);
            }
            length = s.length();
            if (s.length() != 0) {
     
                for (int i = 0; i < (8 - length); i++) {
     
                    s = s + "0";
                }
                System.out.println(s);
                s = "";
            }
        }
    }
}

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

输入描述:
输入一个十六进制的数值字符串。注意:一个用例会同时有多组输入数据,请参考帖子https://www.nowcoder.com/discuss/276处理多组输入的问题。

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

写一个方法调用的误区,刚开始直接调用了valueof方法,最后一直报错,终于找得到了原因;
输入格式
0xA
0xAA
,但是,但是这个时候调用Integer.valueOf(s, 16)方法的时候是直接根据方法内第二个参数判断进制,(重点来了)进入到源码中我们可以看到,0XAA会被直接进行16进制的转换并且会把 代码16进制标识的0X也进行转换,我们知道16进制是从0-F,那么这个X转换肯定就会有问题,于是就报错了。因此需要截取字符串

import java.util.Scanner;

/**
 * @author chens
 * Date: 2021/1/19
 */
public class Test5 {
     

    public static void main(String[] args) {
     
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
     
            String s = scanner.nextLine();
            s = s.substring(2);//截断前两位0X字符
            Integer integer = Integer.valueOf(s, 16);
            System.out.println(integer.toString());
        }
    }
}

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

import java.net.URL;
import java.util.*;

/**
 * @author chens
 * Date: 2021/1/20
 */
public class Test6 {
     
    /**
     * 功能:输入一个long整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )最后一个数后面也要有空格
     */

    public static void main(String[] args) {
     
        Scanner scanner = new Scanner(System.in);
        Long i = scanner.nextLong();
        if (i != 1) {
     
            double max = Math.sqrt(i);
            for (long j = 2; j <= max; j++) {
     
                while (i % j == 0) {
     
                    System.out.println(j + " ");
                    i = i / j;
                }
            }
        }
        System.out.println(i== 1 ? "": i+" ");
    }
}

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

import java.util.Scanner;

/**
 * @author chens
 * Date: 2021/1/20
 */
public class Tets7 {
     
    public static void main(String[] args) {
     
        Scanner scanner = new Scanner(System.in);
        String string = scanner.nextLine();
        String[] strings = string.split("\\.");
        Double dot = Double.valueOf("0."+strings[1]);
        int index = Integer.parseInt(strings[0]);
        Double max = 0.5;
        if (dot >= max) {
     
            index += 1;
        }
        System.out.println(index);
    }
}

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

输入描述:
先输入键值对的个数
然后输入成对的index和value值,以空格隔开

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

示例1
输入
复制
4
0 1
0 2
1 2
3 4
输出
复制
0 3
1 2
3 4


import java.util.*;

/**
 * @author chens
 * Date: 2021/1/21
 */
public class Test8 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int count = Integer.parseInt(scanner.nextLine());
        Map hash = new HashMap();
        for (int i = 0; i < count; i++) {
            String nextLine = scanner.nextLine();
            Integer key = Integer.valueOf(nextLine.split(" ")[0]);
            Integer value = Integer.valueOf(nextLine.split(" ")[1]);
            if (hash.containsKey(key)) {
                hash.put(key, hash.get(key) + value);
            } else {
                hash.put(key,value);
            }
        }
        ArrayList ts = new ArrayList(hash.keySet());
        Collections.sort(ts);
        for (Integer t : ts) {
            System.out.println(t+" "+hash.get(t));
        }
    }
}

九、 输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。保证输入的整数最后一位不是0。

输入描述:
输入一个int型整数

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

输入 9876673 输出 37689

package Machine_test;

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

/**
 * @author chens
 * Date: 2021/1/21
 */
public class Test9 {
     
    public static void main(String[] args){
     
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        StringBuffer sb = new StringBuffer(s);//放入动态字符串
        sb = sb.reverse();//反转
        Set<String> set = new HashSet<String>();
        for(int i=0;i<sb.length();i++){
     
            if(set.add(sb.substring(i,i+1))){
     
                System.out.print(sb.substring(i,i+1));
            }
        }
    }
}

边工作、变刷题,美滋滋。

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

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

package Machine_test;

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

/**
 * @author chens
 * Date: 2021/1/21
 */
public class Test10 {
     
    public static void main(String[] args) {
     
        Scanner scanner = new Scanner(System.in);
        char[] chars = scanner.nextLine().toCharArray();
        Set<Character> set = new HashSet();
        for (int i = 0; i < chars.length; i++) {
     
            if (chars[i] > 0 && chars[i] < 127) {
     
                set.add(chars[i]);
            }
        }
        System.out.println(set.size());
    }
}

十一、输入一个整数,将这个整数以字符串的形式逆序输出程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001。

package Machine_test;

import java.util.Scanner;

/**
 * @author chens
 * Date: 2021/1/21
 */
public class Test11 {
     
    public static void main(String[] args) {
     
        Scanner scan = new Scanner(System.in);
        StringBuffer stringBuffer = new StringBuffer(scan.nextLine());
        System.out.println(stringBuffer.reverse());
    }
}

做到这个地方,有些感觉,单纯的追求编码速度的话,这种方法还可以。但是运算速度并不高。如果采用字符数组或者单纯的字符串循环手动输出,速度还要更快。

十二、将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符

package Machine_test;

import java.util.Scanner;

/**
 * @author chens
 * Date: 2021/1/21
 */
public class Test11 {
     
    public static void main(String[] args) {
     
        Scanner scan = new Scanner(System.in);
        String[] s = scan.nextLine().split(" ");
        for (int i = s.length - 1; i > 0; i--) {
     
            System.out.print(s[i] + " ");
        }
        System.out.print(s[0]);
    }
}

你可能感兴趣的:(Java,JAVA面试,java)