题目
任何一篇仅有英文字母的文章,如果大小写字母数量不相同,会被认为文章不优雅。现在要对给定的文章(即输入字符串)进行修改,使其变得优雅,请确定至少修改多少字符的大小写即可使文章变得优雅。输入的字符串一定是偶数长度的,输出修改次数即可。
示例:
输入:
AAAb
输出:
1
思路
- 这种不确定修改方向,只问修改次数的问题,在遍历时的flag设置成可以向上变化或者向下变化,即可统计修改次数。
- 这里我们可以设置一个计数器cnt,初值为0,假如遍历到大写就cnt++,遍历到小写就cnt–,遍历完成后输出cnt的绝对值的一半即可(输入一定是偶数个字母,那么cnt一定可以被2整除)。
- 假如问题要求输出至少一种修改方案,可在遍历时维护两个队列(数据结构可以根据对输出修改方案的要求进行选择),里面分别存大小写字母的下标,然后根据cnt的正负符号和大小选择修改对应下标的字母,减少部分时间花销。
代码
单纯统计修改次数的代码:
public class Solution {
public int count(String str){
if(str==null||str.length()==0)
return 0;
int cnt = 0;
for(int i=0;i<str.length();i++){
if(str.charAt(i)>='a'&&str.charAt(i)<='z')
cnt--;
else if(str.charAt(i)>='A'&&str.charAt(i)<='Z')
cnt++;
}
return Math.abs(cnt/2);
}
}
输出一种修改方案的代码:
public class Solution {
public String modify(String str){
if(str==null||str.length()==0)
return "";
int cnt = 0;
Queue<Integer> upper = new LinkedList<>();
Queue<Integer> lower = new LinkedList<>();
char[] chars = str.toCharArray();
for(int i=0;i<chars.length;i++){
if(str.charAt(i)>='a'&&str.charAt(i)<='z'){
cnt--;
lower.add(i);
}
else if(str.charAt(i)>='A'&&str.charAt(i)<='Z'){
cnt++;
upper.add(i);
}
}
cnt /= 2;
if(cnt<0){
while (cnt++<0)
chars[lower.poll()] -= 32;
}
else if(cnt>0){
while (cnt-->0)
chars[upper.poll()] += 32;
}
return new String(chars);
}
}
啊这个不需要图