正如我所尝试的,它给出了ArrayIndexOutOfBounds Ecxeption并且不打印最后一个char 请帮我查一下我的代码中的错误。还有其他的
public static void sequenceCount(String s) {
int counter;
int i=0;
char c;
char[] arr = s.toCharArray();
while(i<arr.length){
counter=0;
c = arr[i];
while(c==arr[i]){
counter++;
i++;
}
System.out.println("letter"+" "+c+":"+"number of times"+counter);
}
}
由于我是java的新手,我的代码可能效率低下
答案 0 :(得分:2)
您的内部循环不受数组长度的约束。尝试:
while(i < arr.length && c==arr[i]){
counter++;
i++;
}
答案 1 :(得分:1)
这样做 - 你需要确保你的内部循环没有超出字符串的结尾,你也需要总是抓住最后一个字母:
public static void sequenceCount(String s) {
char[] arr = s.toCharArray();
int i = 0, n = arr.length;
while (i < n) {
char c = arr[i];
int count = 0;
do {
++i; ++count;
} while (i < n && arr[i] == c);
System.out.println("letter "+ c +":"+"number of times " + count);
}
}
答案 2 :(得分:1)
我的方法是使用两个for
循环。
第一个for
循环将运行一个循环,其等效值为A到Z.
第二个for
循环将运行一个遍历整个字符数组/字符串的循环(我更喜欢这里的字符串而不是字符数组)并检查该索引处的给定值是否为等于第一个for
循环运行的值。如果它们等于加一个来计数。打印。
每次运行后都不要忘记重置计数器。
可以在此处找到类似的主题:Counting letters in a string using two for-loops
答案 3 :(得分:0)
虽然这里的许多答案都是O(n ^ 2),但我尝试使用递归在O(n)时间内完成。这是从我已经拥有的现有代码修改的,所以我知道该方法返回一个int,但我不使用它(它是从复制的代码中遗留下来的 - 根据你的需要修复它)
public class CountCharSeqRecursive {
private String test = "AAABBA"; // (3)A(2)B(1)A
private StringBuilder runningString = new StringBuilder();
public static void main(String[] args) {
CountCharSeqRecursive t = new CountCharSeqRecursive();
System.out.println(t.getEncryptedValue(t.test));
}
public String getEncryptedValue(String seq){
int startIndex=0;
this.createCounterSeq(seq.charAt(startIndex), seq, startIndex);
return runningString.toString();
}
private int createCounterSeq(char prev, String sequence, int currentIndex){
return createCounterSeq(prev, sequence, currentIndex, 0);
}
private int createCounterSeq(char prev, String sequence, int currentIndex, int count){
if(currentIndex<sequence.length()){
char current = sequence.charAt(currentIndex);
if((prev^current) < 1){
++count;
}else {
this.addToSequence(count, prev);
count = 1;
}
return count += createCounterSeq(current, sequence, ++currentIndex, count);
}
this.addToSequence(count, prev);
return count;
}
private void addToSequence(int count, char ch){
runningString.append("("+count+")").append(ch);
}
}
答案 4 :(得分:0)
我的解决方案使用HashSet,适用于所有非空字符串的情况。
public static void main(String[] args) {
// TODO Auto-generated method stub
HashSet<Character> set = new HashSet<Character>();
String input = "aabbcdeaab";
set.add(input.charAt(0));
int count = 1;
StringBuilder output = new StringBuilder("");
for(int i=1;i<input.length();i++) {
char next = input.charAt(i);
if(set.contains(next)) {
count++;
}else {
char prev = input.charAt(i-1);
output.append(Character.toString(prev) + count );
set.remove(prev);
set.add(next);
count=1;
}
}
output.append(Character.toString(input.charAt(input.length()-1)) + count );
System.out.println(output.toString());
}