1. 程式人生 > >2019年華為春招實習筆試題

2019年華為春招實習筆試題

1.字串重排

題目描述  

給你一個原始字串,根據該字串內每個字元出現的次數,按照ASCII碼遞增順序重新調整輸出。

【溫馨提示】 
(1).原始字串中僅可能出現“數字”和“字母”; 
(2).請注意區分字母大小寫。 
輸入描述: 
eeefgghhh 
輸出描述: 
efghegheh 
示例1 
輸入 
eeefgghhh 
輸出 

efghegheh

分析:簡要步驟分析:

            1.從字串頭開始,將每個字元取出作為鍵值,裝入TreeMap集合,字元出現的次數作為TreeMap的值

            2.遍歷TreeMap集合,找到字元重複最多的次數,計為count

            3.遍歷集合count次,輸出集合的鍵值,每次輸出後,將鍵對應的值減去1

程式碼實現:

import java.util.Scanner;
import java.util.TreeMap;

public class Main {
	public static void main(String[] args)
	{
		Scanner in = new Scanner(System.in);
		while(in.hasNext())
		{
			String str = in.next();
			char[] ch = str.toCharArray();
			TreeMap<Character,Integer> treeMap = new TreeMap<>();//採用TreeMap,是因為可以用它排序
			for(int i=0;i<ch.length;i++)
			{
				if(treeMap.containsKey(ch[i]))
					treeMap.put(ch[i], treeMap.get(ch[i])+1);
				else
					treeMap.put(ch[i],1);
			}
			
			int count = 0;
			for(char c:treeMap.keySet())    //獲取重複最多的字元的重複次數
			{
				if(treeMap.get(c)>count)
					count = treeMap.get(c);
			}
			
			for(int i=0;i<count;i++)
			{
				for(char c:treeMap.keySet())
				{
					if(treeMap.get(c)>0)    //有些字元已經為0了,就不在輸出了
					{
						treeMap.put(c, treeMap.get(c)-1);
						System.out.print(c);
					}
				}
			}
			System.out.println();

		}
	}
}

2.跳躍比賽

題目

題目描述 
給出一組正整數,你從第一個數向最後一個數方向跳躍,每次至少跳躍1格,每個數的值表示你從這個位置可以跳躍的最大長度。計算如何以最少的跳躍次數跳到最後一個數。

輸入描述: 
第一行表示有多少個數n 
第二行開始依次是1到n個數,一個數一行 
輸出描述: 
輸出一行,表示最少跳躍的次數。 
示例1 
輸入 








輸出 

3

分析:這是道題可以用貪心演算法,找一個簡單的例子,[2,3,1,1,4],從下標為0可以選擇跳到下標為1或者下標為2的位置,對於是跳下標為1的位置還是跳到下標為2的位置,這時採用的方式是考慮,在跳到某個下標後從這個下標可以跳到更遠的位置,例如,在下標為1處,下次可以跳到下標為4處(1+a[1]=4),而在下標為2的位置,下次可以跳到(2+a[2]=3),那麼就選擇從下標為0跳到下標為1處,後面的跳法依舊。

程式碼實現:
class TanXin
{
	public static void main(String[] args)
	{
		Scanner in = new Scanner(System.in);
		while(in.hasNext())
		{
			int n = in.nextInt();
			int[] nums = new int[n];
			for(int k=0;k<n;k++)
			{
				nums[k] = in.nextInt();
			}
			int i = 0;
			int j = 0;        //j用來記錄從下標為j,可以跳到更遠的位置
			int max = 0;      
			int count= 0;     //記錄跳躍的次數
			while(i+nums[i]<nums.length)
			{
				for(int k=i;k<=i+nums[i];k++)
				{
					if(k+nums[k]>max)
					{
						j = k;
						max = k + nums[k];
					}
				}
				i = j;
				count++;
				max = 0;
			}
			System.out.println("count: "+count);
		}
	}
}