华为 2018 笔试题(IT应用软件开发工程师岗)

时间:2022-07-02 15:30:45

  昨天做的华为笔试题,三道编程题,嗯,总共600分,难度应该是依次上升吧,

通常分值分布是100分、200分、300分。两道AC了,一道75%,应该能进面试了吧。

趁着热乎来mark一下。

1.题意大概描述:输入一个整数,输出整数的位数,倒序输出它的每一位数字(数字

之间空格分开)和倒序的连续数值,而且题目限定了输入的整数不超过五位数。

题目所给例子:

输入:-12345

输出:-5 4 3 2 1

          -54321

 1 import java.util.Scanner;
 2 public class Main{
 3    public static void main(String[] args) throws Exception
 4    {
 5      Scanner sc = new Scanner(System.in);
 6      while(sc.hasNext())
 7      {
 8         String str = sc.nextLine();
 9         int flag = 0; //是否是负数标志位
10         if(str.contains("-"))
11        {
12          flag = 1;
13          str = str.substring(1);
14        } 
15        int len = str.length();
16        System.out.println(len);
17       if(flag == 1)
18         System.out.print("-");
19       for(int i = len-1; i >= 0;i--)
20      { 
21         if(i != 0)
22           System.out.print(str.charAt(i)+" ");
23         else
24           System.out.println(str.charAt(i));
25      }
26       if(flag == 1)
27         System.out.print("-");  
28         System.out.println(new StringBuffer(str).reverse().toString());  
29      }
30    }
31 }

2. 题意大概描述:输入四个ip,前两个表示第一个ip段的起始地址和终止地址,后两个表示

第二个ip段的起始地址和终止地址(题目这么描述的时候,我有理由怀疑输入顺序有可能和

是起始ip地址和终止ip地址是不按顺序输入的),然后判断两个ip段是否有交集。若有则输出

Overlap IP,若没有则输出No Overlap IP。

题目所给例子:

输入:1.1.1.1

          255.255.255.255

          2.2.2.2

         3.3.3.3

输出:Overlap IP

这个题我是有点蒙,当时就直接跳转第三题了,怕时间不够,做完第三题再来做的第二题。

但是后来这个题还是没能AC,嗯,就是这道题通过率只有75%,对ip这个分段还是不熟悉,

有时间得把这个坑给填了。昨天写的代码如下(改天填坑):

 1 import java.util.Scanner;
 2 public class Main{
 3     public static void main(String[] args)
 4     {
 5       Scanner sc = new Scanner(System.in);
 6       String[] ip = new String[4]; 
 7       while(sc.hasNext())
 8        {
 9           int[] numip = new int[4];
10           for(int i =0;i<4;i++)
11          {
12             ip[i] = sc.nextLine(); 
13             String[] arr = ip[i].split("\\.");
14             int[] ar = new int[4];
15             for(int j=0;j<4;j++)
16             {
17                ar[j]= Integer.valueOf(arr[j]);
18             }
19               numip[i] = (ar[0]<<24)+(ar[1]<<16)+(ar[2]<<8)+(ar[3]);
20          }
21         if(Math.max(numip[0],numip[1]) <Math.min(numip[3],numip[2])
22            ||Math.min(numip[0],numip[1])>Math.max(numip[3],numip[2])){
23                 System.out.println("No Overlap IP");
24         }else{
25               System.out.println("Overlap IP");
26             }   
28        }
29     }
30 }

3.题意大概描述:输入一连串整数,整数之间以空格分开,,再输入一个整数表示

按照固定规则排序后的位置,然后输出重新排序后对应的这个位置的整数。题目

所给排序规则为:按照每个整数的后三位进行比较大小,按从小到大排序,不足

三位的按原数值参与比较。倘若按规则比较两个数值相同,则顺序为输入时的相对

位置。

题目所给例子:

输入:1223 22 3232 2016 

        : 3

输出:1223

这个题以前做过类似的,按照后几位排序的,所以昨天先选择做的这道。

//正解。。 

public class Main { 2 public static void main(String[] args) { 3 4 Scanner sc = new Scanner(System.in); 5 while(sc.hasNext()) 6 { 7 String input = sc.nextLine(); 8 int index = Integer.parseInt(sc.nextLine()); 9 System.out.println(sort(index, input)); 10 } 11 } 12 13 public static String sort(int index, String input) { 14 15 String[] strs = input.split(" "); 16 if (index > strs.length) return null; 17 insertSort(strs); 18 return strs[index - 1]; 19 } 20 21 public static void insertSort(String[] strs) { 22 23 for (int i = 1; i < strs.length; ++i) 24 { 25 int j = 0; 26 while (j < i) { 27 if (convert(strs[j]) <= convert(strs[i])) ++j; 28 else break; 29 } 30 String tmp = strs[i]; 31 for (int k = i; k > j; --k) 32 { 33 strs[k] = strs[k - 1]; 34 } 35 strs[j] = tmp; 36 } 37 } 38 39 public static int convert(String str) 40 { 41 int num = Integer.parseInt(str); 42 if (str.length() > 3) 43 { 44 num = Integer.parseInt(str.substring(str.length() - 3)); 45 } 46 return num; 47 } 48 }
、、第一遍做的错误解,还没修正过来。。。。。
public class Main
{
    public static void main(String[] args) throws Exception
    {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext())
        {
            String str = sc.nextLine();
            int index = sc.nextInt();
            String[] strs = str.split(" "); 
            
            if(index<=0||index>strs.length)
                continue;
            int[] arr = convert(strs);
            for(int i = 0;i<strs.length;i++)
            {
                if(strs[i].contains(String.valueOf(arr[index-1])))
                    {
                    System.out.println(strs[i]);
                    break;
                    }
            }
        }
    }
    //将后三位转换为整数,并排序然后返回排序好了的数组
    public static int[] convert(String[] strs)
    {
        int[] numstrs = new int[strs.length];
        for(int i = 0;i < strs.length;i++)
        {
            if(strs[i].length()>3)
            numstrs[i]=Integer.parseInt(strs[i].substring(strs[i].length()-3));
             if(strs[i].length()>0&&strs[i].length()<=3) {
                numstrs[i]=Integer.parseInt(strs[i]);
            }
        }
        Arrays.sort(numstrs);
     // for(Integer num:numstrs)
      //      System.out.println("---"+num);
        return numstrs;
    }
}