两道华为机考题

题目一:通过键盘输入一串小写字母(a~z)组成的字符串。
          请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
  比如字符串“abacacde”过滤结果为“abcde”。

  【输入】 pInputStr:  输入字符串
              lInputLen:  输入字符串长度        
  【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长; 

  【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出

  示例
  输入:“deefd”        输出:“def”
  输入:“afafafaf”     输出:“af”

  输入:“pppppppp”     输出:“p”

思路:过滤,顾名思义也就是将相同的字符过滤掉,过滤剩下的字符都是不同的。那么我们可以新建一个容器用于存放当前过滤剩下的字符,然后每经过一个字符,则把字符与容器中的字符做比较,容器中有一个这样的字符,则过滤掉,反之,则放入容器中。

具体java代码:

public class Charfilter {

	/**
	 * @param a
	 * @param list
	 * 判断字符是否该放入到list中,如果list中包含有改字符,return false,如果不包含,则return true
	 */
	public static boolean compare(char a,List<Character> list){
		//list为空,则表示是第一个字符,肯定放入
		if (list.isEmpty()) {
			return true;
		}
		for (int i = 0; i < list.size(); i++) {
			//只要在list中找到一个字符与判断字符相同,则返回false
			if (a == list.get(i)) {
				return false;
			}
		}
		//若都不相同,则返回true
		return true;
	}
	
	/**
	 * @param input
	 * @return String 
	 * 字符串过滤器
	 */
	public static String Filter(String input){
		char[] cha = input.toCharArray();
		List<Character> list = new ArrayList<Character>();//list用于存放过滤后的字符
		for (int i = 0; i < cha.length; i++) {
			if(compare(cha[i], list)){
				list.add(cha[i]);
			}
		}
		//将过滤后的字符串从list取出放入StringBuffer,转String返回
		StringBuffer out = new StringBuffer();
		for (int i = 0; i < list.size(); i++) {
			out.append(list.get(i));
		}
		return out.toString();
	}
	
	public static void main(String[] args){
		
		Scanner scanner = new Scanner(System.in);
		String str = scanner.nextLine();
		String newstr = Filter(str);
		System.out.println(newstr);
		scanner.close();
	}
}

题二:题目描述(40分):
  通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
  压缩规则:
  1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".
  2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"

  【输入】 pInputStr:  输入字符串
           lInputLen:  输入字符串长度         
  【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;

  【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出

  示例 
  输入:“cccddecc”   输出:“3c2de2c”
  输入:“adef”     输出:“adef”
  输入:“pppppppp” 输出:“8p”

思路:首先,大体思路还是将压缩后字符串放入到一个新的容器。字符串压缩程序,需要统计相同且位置相邻的字符的数量,所以需要一个计数器,计数器每次开始计数时为1,当字符数量只为1的时候不显示1,大于1则显示。每一轮计数结束后,将统计的数量和被压缩的字符放入到容器中,然后将计数器回到初始值1。整个过程需要注意临界值判断的问题,一不小心就数组越界了。

具体代码:

public class CharCompress {

	public static String Compress(String str){
		
		char[] cha = str.toCharArray();
		List<String> list = new ArrayList<String>();//用list存放压缩后的字符串
		for (int i = 0; i < cha.length; i++) {
			int count = 1;   //设置一个计数器,用于计算位置相邻并相同字符的数量
			//利用while循环来寻找相邻且相同的字符,计算其数量,这里注意数组越界的问题
			while(i <= cha.length - 2 && cha[i] == cha[i+1]){
				count++;
				i++;
			}
			//字符数量为1的时候不显示1
			if (count != 1) {
				list.add(String.valueOf(count));
			}
			list.add(String.valueOf(cha[i]));
		}
		//将压缩后的字符串从list取出,放入StringBuffer再转为String返回
		StringBuffer s = new StringBuffer();
		for (int i = 0; i < list.size(); i++) {
			s.append(list.get(i));
		}
		return s.toString();
	}
	public static void main(String[] args){
		Scanner scanner = new Scanner(System.in);
		String str = scanner.nextLine();
		String newstr = Compress(str);
		System.out.println(newstr);
		scanner.close();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值