注册 登录
编程论坛 JAVA论坛

求助,代码里报错的部分要怎么修改呢

遗情处有诗章 发布于 2018-03-22 09:31, 2370 次点击
程序代码:

import java.util.Scanner;
public class text {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
         while(in.hasNext()){
             String s = in.next();
             char type = s.charAt(0);

             String[] str=new String[100];
                if(type == 'C'){

                    int len = str.length;

                    int cnt = 1;

                    for(int i = 0;i < len;i++){

                        if(str[i] == str[i+1]){

                            cnt++;

                        }else{

                            if(cnt>1){

                                System.out.printf("%d",cnt);

                            }

                            System.out.printf("%c",str[i]);

                            cnt = 1;

                        }

                    }

                }else{

                    int len = str.length;

                    int cnt = 0;

                    for(int i = 0;i < len;i++){

                       

                        if(str[i]<='9'&&str[i]>='0'){

                            cnt*=10;

                            cnt+=str[i]-'0';

                        }else{

                            if(cnt == 0){

                                System.out.printf("%c",str[i]);

                            }else

                            for(int j = 0;j < cnt;j++){

                                System.out.printf("%c",str[i]);

                            }

                            cnt = 0;

                        }

                    }

                }

         }
    in.close();
    }

}
只有本站会员才能查看附件,请 登录
10 回复
#2
疯狂的小a2018-03-22 09:53
程序代码:
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            String s = in.next();
            char type = s.charAt(0);
            String[] str = new String[100];
            if (type == 'C') {
                int len = str.length;
                int cnt = 1;
                for (int i = 0; i < len; i++) {
                    if (str[i] == str[i + 1]) {
                        cnt++;
                    } else {
                        if (cnt > 1) {
                            System.out.printf("%d", cnt);
                        }
                        System.out.printf("%c", str[i]);
                        cnt = 1;
                    }
                }
            } else {
                int len = str.length;
                int cnt = 0;
                for (int i = 0; i < len; i++) {
                    if (str[i].toCharArray()[0] <= '9' && str[i].toCharArray()[0] >= '0') {
                        cnt *= 10;
                        cnt += str[i].toCharArray()[0] - '0';
                    } else {
                        if (cnt == 0) {
                            System.out.printf("%c", str[i]);
                        } else
                            for (int j = 0; j < cnt; j++) {
                                System.out.printf("%c", str[i]);
                            }
                        cnt = 0;
                    }
                }
            }
        }
        in.close();
    }
}
已经可以不报错了,但是会有java.lang.ArrayIndexOutOfBoundsException
#3
遗情处有诗章2018-03-22 12:28
回复 2楼 疯狂的小a
现在是运行的时候有问题了
只有本站会员才能查看附件,请 登录

题目是:文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示。例如 ccccc 就用 5c 来表示。如果字符没有重复,就原样输出。例如 aba 压缩后仍然是 aba。
解压方法就是反过来,把形如 5c 这样的表示恢复为 ccccc。
本题需要你根据压缩或解压的要求,对给定字符串进行处理。这里我们简单地假设原始字符串是完全由英文字母和空格组成的非空字符串。

只有本站会员才能查看附件,请 登录

#4
遗情处有诗章2018-03-22 12:30
回复 2楼 疯狂的小a
数组越界要怎么去修改呢
#5
疯狂的小a2018-03-22 18:35
程序代码:
import java.util.ArrayList;
import java.util.Scanner;

/*题目是:

 * 文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示。

 * 例如 ccccc 就用 5c 来表示。

 * 如果字符没有重复,就原样输出。

 * 例如 aba 压缩后仍然是 aba。

 * 解压方法就是反过来,把形如 5c 这样的表示恢复为 ccccc。

 * 本题需要你根据压缩或解压的要求,对给定字符串进行处理。

 * 这里我们简单地假设原始字符串是完全由英文字母和空格组成的非空字符串。
*/
public class Test {
    public static void main(String[] args) {

        // 将字符串转字符数组
        char[] chs = getCharArray();
        // 将字符数组进行压缩后转字符串
        String zipStr = zipChsToStr(chs);
        System.out.println("压缩后字符串: " + zipStr);
        // 将压缩的字符串转正常字符串
        String looseStr = getLooseStr(zipStr);
        System.out.println("解压后字符串: " + looseStr);

    }

    // 解压字符串
    public static String getLooseStr(String zipStr) {
        char[] chs = zipStr.toCharArray();
        StringBuffer looseStr = new StringBuffer("");
        for (int i = 0; i < chs.length; i++) {
            if (chs[i] > '1' && chs[i] <= '9') {
                int len = Integer.parseInt("" + chs[i]);
                for (int j = 1; j < len + 1; j++) {
                    looseStr.append(chs[i + 1]);
                }
            } else {
                looseStr.append(chs[i]);
            }
        }
        return looseStr.toString();
    }

    // 压缩字符串
    public static String zipChsToStr(char[] chs) {
        // 遍历数组,记录重复字符的索引
        ArrayList<Integer> indexs = new ArrayList<Integer>();
        indexs.add(0);
        for (int i = 0; i < chs.length - 1; i++) {
            for (int j = i + 1; j < chs.length; j++) {
                if (chs[i] == chs[j]) {
                    continue;
                } else {
                    indexs.add(j);
                    i = j - 1;
                    break;
                }
            }
        }
        // 定义一个要返回的字符串
        StringBuffer buffer = new StringBuffer("");
        for (int i = 0; i < indexs.size() - 1; i++) {
            if ((indexs.get(i + 1) - indexs.get(i)) > 1) {
                buffer.append((indexs.get(i + 1) - indexs.get(i)) + "" + chs[indexs.get(i)]);
            } else {
                buffer.append("" + chs[indexs.get(i)]);
            }
        }
        if ((chs.length - indexs.get(indexs.size() - 1)) > 1) {
            buffer.append(chs.length - indexs.get(indexs.size() - 1) + "" + chs[indexs.get(indexs.size() - 1)]);
        } else {
            buffer.append("" + chs[indexs.get(indexs.size() - 1)]);
        }
        return buffer.toString();
    }

    public static char[] getCharArray() {
        for (;;) {
            System.out.print("请输入一个字符串(由英文字母和空格组成的非空字符串):");
            Scanner sc = new Scanner(System.in);
            String str = sc.nextLine();// 输入的字符串
            
// 对字符串进行校验
            char[] chs = str.toCharArray();
            boolean flag = true;
            for (char c : chs) {
                if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (' ' == c))) {
                    flag = false;
                    break;
                }
            }
            if (!flag) {
                System.out.println("输入不符合要求!");
                continue;
            }
            
            sc.close();
            
            return chs;
        }
    }
}
#6
遗情处有诗章2018-03-22 19:22
回复 5楼 疯狂的小a
代码运行起来还是有问题呀
输入压缩指令之后就直接运行了 (还没输入要压缩的字符串呢)
#7
疯狂的小a2018-03-22 19:44
回复 6楼 遗情处有诗章
你说的什么意思....
#8
疯狂的小a2018-03-22 20:07
程序代码:
import java.util.ArrayList;
import java.util.Scanner;

/*题目是:

 * 文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示。

 * 例如 ccccc 就用 5c 来表示。

 * 如果字符没有重复,就原样输出。

 * 例如 aba 压缩后仍然是 aba。

 * 解压方法就是反过来,把形如 5c 这样的表示恢复为 ccccc。

 * 本题需要你根据压缩或解压的要求,对给定字符串进行处理。

 * 这里我们简单地假设原始字符串是完全由英文字母和空格组成的非空字符串。
*/
public class Test {
    public static void main(String[] args) {

        for (;;) {
            System.out.println("请输入解压缩指令('C'表示压缩,'D'表示解压): ");
            Scanner sc = new Scanner(System.in);
            String type = sc.nextLine();
            if ((char) type.toCharArray()[0] == 'C') {
                // 将字符串转字符数组
                char[] chs = getCharArray();
                // 将字符数组进行压缩后转字符串
                String zipStr = zipChsToStr(chs);
                System.out.println("压缩后字符串: " + zipStr);
                continue;

            } else if ((char) type.toCharArray()[0] == 'D') {
                System.out.println("请输入一个要解压的字符串:");
                String zipStr = sc.nextLine();
                // 将压缩的字符串转正常字符串
                String looseStr = getLooseStr(zipStr);
                System.out.println("解压后字符串: " + looseStr);
                continue;
            } else {
                System.out.println("输入有误,请重新输入!");
                continue;
            }

        }

    }

    // 解压字符串
    public static String getLooseStr(String zipStr) {
        char[] chs = zipStr.toCharArray();
        StringBuffer looseStr = new StringBuffer("");
        for (int i = 0; i < chs.length; i++) {
            if (chs[i] > '1' && chs[i] <= '9') {
                int len = Integer.parseInt("" + chs[i]);
                for (int j = 1; j < len + 1; j++) {
                    looseStr.append(chs[i + 1]);
                }
            } else {
                looseStr.append(chs[i]);
            }
        }
        return looseStr.toString();
    }

    // 压缩字符串
    public static String zipChsToStr(char[] chs) {
        // 遍历数组,记录重复字符的索引
        ArrayList<Integer> indexs = new ArrayList<Integer>();
        indexs.add(0);
        for (int i = 0; i < chs.length - 1; i++) {
            for (int j = i + 1; j < chs.length; j++) {
                if (chs[i] == chs[j]) {
                    continue;
                } else {
                    indexs.add(j);
                    i = j - 1;
                    break;
                }
            }
        }
        // 定义一个要返回的字符串
        StringBuffer buffer = new StringBuffer("");
        for (int i = 0; i < indexs.size() - 1; i++) {
            if ((indexs.get(i + 1) - indexs.get(i)) > 1) {
                buffer.append((indexs.get(i + 1) - indexs.get(i)) + "" + chs[indexs.get(i)]);
            } else {
                buffer.append("" + chs[indexs.get(i)]);
            }
        }
        if ((chs.length - indexs.get(indexs.size() - 1)) > 1) {
            buffer.append(chs.length - indexs.get(indexs.size() - 1) + "" + chs[indexs.get(indexs.size() - 1)]);
        } else {
            buffer.append("" + chs[indexs.get(indexs.size() - 1)]);
        }
        return buffer.toString();
    }

    public static char[] getCharArray() {
        for (;;) {
            System.out.print("请输入一个字符串(由英文字母和空格组成的非空字符串):");
            Scanner sc = new Scanner(System.in);
            String str = sc.nextLine();// 输入的字符串
            
// 对字符串进行校验
            char[] chs = str.toCharArray();
            boolean flag = true;
            for (char c : chs) {
                if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (' ' == c))) {
                    flag = false;
                    break;
                }
            }
            if (!flag) {
                System.out.println("输入不符合要求!");
                continue;
            }
            return chs;
        }
    }
}
#9
遗情处有诗章2018-03-22 20:27
回复 8楼 疯狂的小a
之前就是只输入压缩指令按下回车代码就直接运行了
这次的可以啦 多谢大神呀
#10
遗情处有诗章2018-03-23 09:39
回复 8楼 疯狂的小a
上面的代码里有我们没学过的函数,一直过不了oj
我又改了这个可以运行了 但是运行时有问题了
程序代码:
import java.util.Scanner;

public class text {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    while (in.hasNext()) {
    String s = in.next();
    char type = s.charAt(0);
    String str = in.nextLine();
    char[] c=str.toCharArray();
    if (type == 'C') {
                int len = str.length();
                int cnt = 1;
                for (int i = 0; i < len; i++) {
                    if (c[i] == c[i + 1]) {
                        cnt++;
                    } else {
                        if (cnt > 1) {
                            System.out.printf("%d", cnt);
                        }
                        System.out.printf("%c", c[i]);
                        cnt = 1;
                    }
                }
            } else {
                int len = str.length();
                int cnt = 0;
                for (int i = 0; i < len; i++) {
                    if (c[i]<= '9' && c[i] >= '0') {
                        cnt *= 10;
                        cnt += c[i] - '0';
                    } else {
                        if (cnt == 0) {
                            System.out.printf("%c", c[i]);
                        } else
                            for (int j = 0; j < cnt; j++) {
                                System.out.printf("%c", c[i]);
                            }
                        cnt = 0;
                    }
                }
            }
        }
        in.close();
    }
}

#11
疯狂的小a2018-03-23 10:57
程序代码:
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            String s = in.next();
            char type = s.charAt(0);
            String str = new Scanner(System.in).nextLine();
            char[] c = str.toCharArray();
            if (type == 'C') {
                System.out.println("cccccc");
                int len = str.length();
                int cnt = 1;
                for (int i = 0; i < len - 1; i++) {
                    if (c[i] == c[i + 1]) {
                        cnt++;
                    } else if(c[i] != c[i + 1]){
                        if (cnt > 1) {
                            System.out.printf("%d", cnt);
                        }
                        System.out.printf("%c", c[i]);
                        cnt = 1;
                    }
                }
            } else {
                System.out.println("dddddd");
                int len = str.length();
                int cnt = 0;
                for (int i = 0; i < len; i++) {
                    if (c[i] <= '9' && c[i] >= '0') {
                        cnt *= 10;
                        cnt += c[i] - '0';
                    } else {
                        if (cnt == 0) {
                            System.out.printf("%c", c[i]);
                        } else
                            for (int j = 0; j < cnt; j++) {
                                System.out.printf("%c", c[i]);
                            }
                        cnt = 0;
                    }
                }
            }
        }
        in.close();
    }
}
你再参考一下我的,把细节处理好,就可以了
1