华为机试题总结


1.题目描述

数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。

输入描述:

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

输出描述:

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

示例1

输入

4
0 1
0 2
1 2
3 4

输出

0 3
1 2
3 4
思路:这边是键值对,想到map集合,在map集合中键是不能重复,值会自动覆盖,而本题是将相同键对应的值相加,所以可以在map集合上稍微修改,即遇到键相同的情况,先取出键对应的值,将值相加后在添加。注意:这里可以看出键值对的顺序是没有改变的,所以选用TreeMap,而不能选用HashMap,如果使用HashMap那么输出的键值对是无序的。
代码实现
import java.util.*;
public class Main
{
    public static void main(String[] args)
    {
        TreeMap treeMap = new TreeMap<>();
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        for(int i=0;i

2.题目描述

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

输入描述:

输入一个int型整数

输出描述:

按照从右向左的阅读顺序,返回一个不含重复数字的新的整数
示例1

输入

9876673

输出

37689

基本思路:该题要先反转,再去重,反转想到使用StringBuffer类的reverse函数,去重想到用set集合,但是注意题中是有序的,所以用LinkedHashSet集合。(注意该题一定要先反转,再去重,先去重,再反转是不行的

方法一:使用LinkedHashSet集合,或根据HashSet添加重复元素时返回false来判断

代码实现:

import java.util.*;
public class Main
{
    public static void main(String[] args)
    {
        int count=0;
        Scanner scanner = new Scanner(System.in);
        //String str = scanner.nextInt().toString();
        String str = Integer.toString(scanner.nextInt());
        String str1 = new StringBuffer(str).reverse().toString();
        //System.out.println(str1);
        TreeSet set = new TreeSet<>();
        for(int i=0;i
如果使用LinkedHashSet使用如下的代码
      Set set = new LinkedHashSet<>();
      for(int i=0;i

方法二:取出最后一个字符,然后取第二个字符,如果不相等,将第二个字符添加到第一个字符的后面,再取第三个字符,依次类推。该方法频繁用到取字符一部分组成新字符的函数substring()

代码实现:

        Scanner in = new Scanner(System.in);
	while(in.hasNext())
	{
	    String str = in.next();
	    String a = str.substring(str.length()-1,str.length());
	    for(int i=str.length()-2;i>=0;i--)
	    {
		 if(!a.contains(str.substring(i,i+1)))
		     a = a + str.substring(i,i+1);
	    }
		 System.out.print(a);
	}
方法三:参考别人的优秀代码
	Scanner in = new Scanner(System.in);
	while(in.hasNext())
	{
		String str = in.next();
		for(int i=str.length()-1;i>=0;i--)
		{
			System.out.print(str.charAt(i));
		}
	}

6.题目描述

假设一个球从任意高度自由落下,每次落地后反跳回原高度的一半; 再落下, 求它在第5次落地时,共经历多少米?第5次反弹多高?  

/**
     * 统计出第5次落地时,共经过多少米?
     * 
     * @param high 球的起始高度
     * @return 英文字母的个数
     */
    public static double getJourney(int high)
    {
        return 0;
    }
    
    /**
     * 统计出第5次反弹多高?
     * 
     * @param high 球的起始高度
     * @return 空格的个数
     */
    public static double getTenthHigh(int high)
    {
        return 0;
    }

输入描述:

输入起始高度,int型

输出描述:

分别输出第5次落地时,共经过多少米第5次反弹多高
示例1

输入

1

输出

2.875
0.03125

基本思路:使用递归解决:可以简单推出,第n个落地经过的米数=n-1次落地经过的米数+高度/(2^(n-2))。

代码实现:

import java.util.*;
public class Main
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        while(in.hasNext())
        {
            int m = Integer.parseInt(in.next());
            System.out.println(getJourney(m,5));
            System.out.println(getTenthHigh(m,5));
        }
    }
     public static double getJourney(int high,int number)
	    {
	        if(number==1)
	            return high;
	        else 
	            return getJourney(high,number-1) + high/Math.pow(2,number-2);//Java的求次方要用函数
	    }
	    public static double getTenthHigh(int high,int number)
	    {
	        return high/Math.pow(2,number);
	    }
}

更优的方法(使用循环来替代递归):


你可能感兴趣的:(学习笔记,华为上机题)