两道华为机考题

来源:互联网 发布:python readlines 编辑:程序博客网 时间:2024/06/08 05:21
题目一:通过键盘输入一串小写字母(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中找到一个字符与判断字符相同,则返回falseif (a == list.get(i)) {return false;}}//若都不相同,则返回truereturn 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的时候不显示1if (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();}}


1 0