题目一:通过键盘输入一串小写字母(a~z)组成的字符串。
请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”。
【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“deefd” 输出:“def”
输入:“afafafaf” 输出:“af”
题二:题目描述(40分):
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".
2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"
【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“cccddecc” 输出:“3c2de2c”
输入:“adef” 输出:“adef”
输入:“pppppppp” 输出:“8p”
请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“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();
}
}