华为机试题

1、描述: 
实现简易字符串压缩算法:一个长度最大为128的字符串,由字母a-z或者A-Z组成,将其中连续出现2次以上(含2次)的字母转换为字母和出现次数,以达到压缩目的。  
运行时间限制: 无限制  
内存限制: 无限制  
输入: 
输入字符串,最大长128  
输出: 
输入字符串  
样例输入: AAAABBBB  

样例输出: A4B4

参考答案:

import java.util.Scanner;

public class Main {
	public static void main(String[] args){
		int count = 1;
		Scanner in = new Scanner(System.in);
		String s = in.next();
		in.close();
		char[] chS = s.toCharArray();
		if (chS.length > 128){
			System.out.println("Length of input string out of bound");
			return;
		}
		StringBuffer compactS = new StringBuffer("");
		compactS.append(chS[0]);
		for (int i = 1; i < chS.length; i++){
			if (chS[i] == chS[i-1]){
				count++;
			}
			else{
				if (count>1){
					compactS.append(count);
				}
				compactS.append(chS[i]);
				count = 1;
			}
		}
		if (count>1){
			compactS.append(count); //这是最后一个字母连续出现的个数
		}
		System.out.println(compactS);
	}
}


2、竞赛积分猜想 描述: 
某公司举办了知识竞赛。题目的计分规则如下: 1.每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前得到的分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。 2.每位选手都有一个起步的分数为10分。?  
程序要求: 
如果某获胜选手最终得分是X分,如果不让你看比赛过程,请推断出他(她)哪个题目答对了,哪个题目答错了吗?把答对的题目记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011?就是一种可能的情况,10道题目的编号从左到右依次排列。  
你的任务是算出满足该得分的所有可能情况,答案之间用|号分隔,并且答案需要进行排序,将答案转换为十进制后数字小的排在前面,即0010110011应该排在1010110011的前面。如果不存在满足该分数的情况,则输出10个0:0000000000


参考答案:

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

public class Main {
	private static int finalScore;
	static ArrayList<String> array = new ArrayList<String>();
	public static void main(String[] args){
		Scanner in = new Scanner(System.in);
		finalScore = in.nextInt();
		in.close();
		char[] answer = new char[10];
		judge(10, 0, answer);
		
		for (int i = 0; i < array.size()-1; i++){
			System.out.print(array.get(i));
			System.out.print("|");
		}
		System.out.print(array.get(array.size()-1));
	}

	private static void judge(int score, int num, char[] answer) {
		if (num == 10){
			if(score == finalScore){
				String res = new String(answer);
				array.add(res);
			}
			return;
		}
		answer[num] = '1';
		judge(score*2, num+1, answer);
		answer[num] = '0';
		judge(score - num - 1, num+1, answer);
	}
}


3. 通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。

补充说明:
1. 操作数为正整数,不需要考虑计算结果溢出的情况。
2. 若输入算式格式错误,输出结果为“0”。

参考答案:

import java.util.Scanner;
import java.util.regex.*;

public class Main {
	public static void main(String[] args){
		Scanner in = new Scanner(System.in);
		String x = in.nextLine();
		in.close();
		Pattern p = Pattern.compile("\\d+\\s+[+|-]{1}\\s+\\d+");
		Matcher m = p.matcher(x);
		Boolean bo = m.matches();
		if (!bo){
			System.out.println("0");
		}
		else{
			String[] spli = x.split("\\s");
		
			int a = Integer.parseInt(spli[0]);
			int b = Integer.parseInt(spli[2]);		
		
			if(spli[1].equals("+")){
				System.out.println(a+b);
			}
			if(spli[1].equals("-")){
				System.out.println(a-b);
			}
				
		}	
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值