华为机试day2

这篇博客主要介绍了华为机试中的一些编程题目,包括质数因子的分解、浮点数取整、合并表记录、统计字符串中不同字符个数的算法。还探讨了Math类的取整方法,Comparator和Comparable接口的比较,以及Collections类在排序算法中的应用。通过示例代码展示了如何实现这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目
1、质数因子

功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 )

 

 

详细描述:


函数接口说明:

    public String getResult(long ulDataInput)

输入参数:

         long ulDataInput:输入的正整数

返回值:

        String

import java.util.ArrayList;
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            long uldataInput = in.nextLong();
            String str = getResult(uldataInput);
            System.out.println(str);
        }
    }
 
    public static String getResult(long ulDataInput) {
        ArrayList<Long> list = new ArrayList<Long>();
        String str = "";
        long tempInput = ulDataInput;
        for (long i = 2; i * i < ulDataInput; i++) {
            while (tempInput % i == 0 && tempInput != 1) {
                list.add(i);
                tempInput = tempInput / i;
            }
        }
        if (tempInput != 1 || tempInput == ulDataInput) {
            list.add(tempInput);
        }
        for (int j = 0; j < list.size(); j++) {
            str += list.get(j) + " ";
        }
        return str;
    }
 
}

2、取近似值

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

importjava.util.Scanner;
 
publicclassMain {
 
    publicstaticvoid main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = newScanner(System.in);
        while(in.hasNext()) {
            doubleval = in.nextDouble();
            System.out.println(Math.round(val));
        }
        in.close();    
    }
 
}

3、合并表记录

数据表记录包含表索引和数值。请对表索引相同的记录进行合并,合并后表记录为相同索引表的数值求和

 

函数说明:

public int mergeRecord(List oriList, List rstList)

数据表记录包含表索引和数值。请对表索引相同的记录进行合并,合并后表记录为相同索引表的数值求和。


 @param oriList 原始表记录。 以List方式存放,TableRecord定义见TableRecord.java,

                调用者无需对leRecord.java做任何修改
 @param rstList 合并后的表记录 , 以List方式存放
 @return  返回合并后表的个数

import java.util.SortedMap;
import java.util.Scanner;
import java.util.TreeMap;
 
public class Main {
     
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        SortedMap<Integer, Integer> hashMap = new TreeMap<Integer, Integer>();     
         
        while (in.hasNext()) {
            int num = in.nextInt();
            for (int i = 0; i < num; i++) {
                int key = in.nextInt();
                int val = in.nextInt();
                if (hashMap.containsKey(key)) {
                    int myval = hashMap.get(key) + val;
                    hashMap.put(key, myval);
                }else {
                    hashMap.put(key, val);
                }
            }  
             
            for (Integer key: hashMap.keySet()) {
                System.out.println(key+" "+hashMap.get(key));
            }          
        }      
        in.close();
    }      
}


4、提取不重复整数

输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。

import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);
        String newStr="";
        while (in.hasNext()) {
            int num = in.nextInt();
            String str = num+"";
            for(int i=str.length()-1;i>=0;i--){
                char ch = str.charAt(i);
                String tempStr=ch+"";
                if(!newStr.contains(tempStr)){
                    newStr +=tempStr;
                }
            }
            System.out.println(newStr);
        }
        in.close();
    }
 
}

5、字符个数统计

编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127)。不在范围内的不作统计。

import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            String str = in.nextLine();
            System.out.println(CountCharNum(str)+"");      
        }
    }
     
    public static int CountCharNum(String str){
        int cnt=0;
        int[] arrs = new int[128];
        for(int i=0;i<str.length();i++){
            char ch = str.charAt(i);
            if(arrs[ch] == 0){
                cnt++;
                arrs[ch]=1;
            }                      
        }
        return cnt;
    }
 
}
二、总结
1、常用类

Math类

三角函数方法
指数函数方法
取整方法
ceil()向上接近整数
floor()向下接近整数
rint()最近的整数
round()返回为int或long
random方法

集合
java集合框架支持两种容器
1、Collection:一种是为了存储一个元素集合,简称集合
2、Map:另一种是为了存储键/值对,简称为图

集合(Collection)有三种类型的集合
1、规则集Set:存储一组不重复的元素
     (1)HashSet散列集:不可预知的顺序存储元素
     (2)LinkedHashSet链式散列集:以元素被插入的顺序存储元素
     (3)TreeSet树形集:存储以排好序的元素。(例如升序降序)

2、线性表List:有元素构造的有序集合
     (1)ArrayList数组线性表:查找比较方便,但插入删除的复制度为O(N)
     (2)LinkedList链表:可以在任意位置插入数据O(1)
3、队列Queue:存储先进先出方式处理对象 

4、Vector接口实现了List接口,在java2 中,Vector和ArrayList是一样的,所不同的是它所包含的访问和就向量的方法是同步的,
Stack类扩张了Vector类,并且提供了几种对栈进行操作的方法



java集合框架所有类都实现了java.lang.cloneable和java.io.serializable接口,都是可复制和可序列化的
java集合框架所有类都包含两个构造函数,一个空的参数,一个Collection参数


图(Map)
1、HashMap散列图:不需要保持图中元素的顺序,就使用HashMap
2、LinkedHaspMap链式散列图:需要保持图中元素的插入顺序或访问顺序,就使用LinkedHashMap
3、TreeMap树形散列图:需要使图按照键值排序,就使用TreeMap




SortedMap类

2、算法

统计字符个数函数中,用到了
int[] arrs = new int[124]
if(arrs[chvalue] == 0)
cnt++;
arrs[chvalue] = 1;

3、Comparor接口和Comparable接口的比较


 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序。下面通过两个例子分别用Comparable和Comparator实现对User对象中年龄排序。

 

1.通过实现Comparable接口,根据User的年龄进行排序。

 

Java代码  收藏代码
  1. import java.util.Arrays;  
  2.   
  3. /** 
  4.  * @author pengcqu 
  5.  *  
  6.  */  
  7. public class ComparableUser implements Comparable {  
  8.   
  9.     private String id;  
  10.     private int age;  
  11.   
  12.     public ComparableUser(String id, int age) {  
  13.         this.id = id;  
  14.         this.age = age;  
  15.     }  
  16.   
  17.     public int getAge() {  
  18.         return age;  
  19.     }  
  20.   
  21.     public void setAge(int age) {  
  22.         this.age = age;  
  23.     }  
  24.   
  25.     public String getId() {  
  26.         return id;  
  27.     }  
  28.   
  29.     public void setId(String id) {  
  30.         this.id = id;  
  31.     }  
  32.   
  33.     public int compareTo(Object o) {  
  34.         return this.age - ((ComparableUser) o).getAge();  
  35.     }  
  36.   
  37.     /** 
  38.      * 测试方法 
  39.      */  
  40.     public static void main(String[] args) {  
  41.         ComparableUser[] users = new ComparableUser[] {  
  42.                 new ComparableUser("u1001"25),  
  43.                 new ComparableUser("u1002"20),  
  44.                 new ComparableUser("u1003"21) };  
  45.         Arrays.sort(users);  
  46.         for (int i = 0; i < users.length; i++) {  
  47.             ComparableUser user = users[i];  
  48.             System.out.println(user.getId() + " " + user.getAge());  
  49.         }  
  50.     }  
  51.   
  52. }  

 

 

2. 通过实现Comparator接口,根据User的年龄进行排序。

 

Java代码  收藏代码
  1. public class User {  
  2.   
  3.     private String id;  
  4.     private int age;  
  5.   
  6.     public User(String id, int age) {  
  7.         this.id = id;  
  8.         this.age = age;  
  9.     }  
  10.   
  11.     public int getAge() {  
  12.         return age;  
  13.     }  
  14.   
  15.     public void setAge(int age) {  
  16.         this.age = age;  
  17.     }  
  18.   
  19.     public String getId() {  
  20.         return id;  
  21.     }  
  22.   
  23.     public void setId(String id) {  
  24.         this.id = id;  
  25.     }  
  26.       
  27.   
  28. }  

 

Java代码  收藏代码
  1. import java.util.Arrays;  
  2. import java.util.Comparator;  
  3.   
  4. /** 
  5.  * @author pengcqu 
  6.  *  
  7.  */  
  8. public class UserComparator implements Comparator {  
  9.   
  10.     public int compare(Object arg0, Object arg1) {  
  11.         return ((User) arg0).getAge() - ((User) arg1).getAge();  
  12.     }  
  13.   
  14.     /** 
  15.      * 测试方法 
  16.      */  
  17.     public static void main(String[] args) {  
  18.         User[] users = new User[] { new User("u1001"25),  
  19.                 new User("u1002"20), new User("u1003"21) };  
  20.         Arrays.sort(users, new UserComparator());  
  21.         for (int i = 0; i < users.length; i++) {  
  22.             User user = users[i];  
  23.             System.out.println(user.getId() + " " + user.getAge());  
  24.         }  
  25.     }  
  26. }  

 

选择Comparable接口还是Comparator?

 一个类实现了Comparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。

Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
2、可以使用多种排序标准,比如升序、降序等。


4、排序算法实现类


Collections类学习

collections类用于操作java的集合类,它是一个静态类,而collection是java的集合类接口

常用方法

sort()
Binaryseach()
max()
min()
reverse
shuffle()








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值