A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 726477179 中级黑马   /  2016-8-14 08:56  /  936 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

需求:已知字符串 "wo111ai222heima",要求去掉里面的所有数字,然后再统计每个字符出现的次数
        public static void main(String[] args) {

                String s = "wo111ai222heima";
                String regex = "\\d";
                String ss = s.replaceAll(regex, "");
                System.out.println(ss);
                char[] c = ss.toCharArray(); //woaiheima
                int[] arr = new int[99];                //arr数组用于计数
                char[] c1 = new char[99];                //c1数组用于存放c数组中的字符,重复时不存储,但arr数组对应的元素+1
                int i = 0;
                a:for (; i < c.length; i++) {       
                        for (int j = 0; j < i; j++) {
                                if (c1[j] == c[i]) {                //判断c1数组中是否有元素与a[i]一致
                                        arr[j]++;                                //有,则与c1[]元素对应的arr元素+1,
                                        continue a;                                //并跳过本次外轮循环,进入下一次循环
                                }
                        }
                        c1[i] = c[i];                                        //不符合一上条件,将c[i]赋值给c1[i],问题出在这,如果符合调节跳过一次外循环。那么c1数组中将有一个元素没被赋值,但是怎么解决呢?
                        arr[i]++;

                }
                for (int j = 0; j < i; j++) {
                        System.out.println(c1[j] + "个数是:" + arr[j]);
                }
        }
运行结果,当有重复元素出现时,c1的赋值直接被跳过了,然后就出现空的情况。结果复制不上来,知道怎么错的,但是不知道怎么改~~

9 个回复

倒序浏览
枫叶红 来自手机 中级黑马 2016-8-14 11:03:34
沙发
[quote]726477179 发表于 2016-8-14 08:56
需求:已知字符串


你的代码太乱,发个完整的别加注释,我给你看看,我这做出来一个,你要不要看看?
回复 使用道具 举报
本帖最后由 水月灬清影 于 2016-8-14 11:21 编辑

[Java] 纯文本查看 复制代码
 public static void main(String[] args) {

         String s = "wo111ai222heima";
         String regex = "\\d";
         String ss = s.replaceAll(regex, "");
         System.out.println(ss);
         char[] c = ss.toCharArray(); 
         int[] arr = new int[99];               
         char[] c1 = new char[99];               
         int i = 0;
         int x=0;     //你代码我没改,只加入这么一个参数,用于记录各个字母一共重复几次,也就是c1数组的长度相比数组c要减少多少,是用来控制“索引指针”在当前位置停留的,任意字母重复1次,那么c1数组“索引指针”就相对于原数组“索引指针”i 前移 1,重复两次,相对于i 前移 2,重复x次,前移x。之所以你的代码会出问题,是因为c1数组如果没有插入新字符,那么就没有对当前索引处的值做任何修改,而索引直接跟着你的外层循环指向下一个位置了。不知道这样说可否明白?
         a:for (i=0; i < c.length; i++) {        
                 for (int j = 0; j < i; j++) {
                         if (c1[j] == c[i]) {              
                                          arr[j]++; 
                                          x++;        //只要重复,x就自加                                                                                                
                                 continue a;                              
                         }
                 }
                 c1[i-x] = c[i];                              //索引相应减少          
                 arr[i-x]++;

         }
         for (int j = 0; j < i-x; j++) {       //c1长度变为i-x
                 System.out.println(c1[j] + "个数是:" + arr[j]);
         }
 }
回复 使用道具 举报
枫叶红 来自手机 中级黑马 2016-8-14 11:27:15
板凳
枫叶红 发表于 2016-8-14 11:03
[quote]726477179 发表于 2016-8-14 08:56
需求:已知字符串

你把continue改成break 试试
回复 使用道具 举报
兄弟,你好,你这个程序出问题的主要原因是:
c1数组、arr数组和c数组的长度是一样的,你都是使用i来进行存储。导致当出现重复字符时,c1数组里面默认为空,arr里面默认为0。
解决办法:
既然问题是c1数组和arr数组的长度不合理,所以需要重新定义一个变量k来规范这两个数组的长度,而不是使用i。
修改方法如下:
public static void main(String[] args) {
         String s = "wo111ai222heima";
         String regex = "\\d";
         String ss = s.replaceAll(regex, "");
         System.out.println(ss);
         char[] c = ss.toCharArray(); //woaiheima
         int[] arr = new int[99];//arr数组用于计数
         char[] c1 = new char[99]; //c1数组用于存放c数组中的字符,重复时不存储,但arr数组对应的元素+1
         int i = 0;
         int k = 0;//用来定义c1数组和arr数组的长度
         a:
        for (; i < c.length; i++) {      
                 for (int j = 0; j < k; j++) { //c1数组的长度为k
                         if (c1[j] == c) {//判断c1数组中是否有元素与a一致
                                 arr[j]++;//有,则与c1[]元素对应的arr元素+1,
                                 continue a; //并跳过本次外轮循环,进入下一次循环
                         }
                 }
                c1[k] = c; //不符合条件,c1数组进行存储,同时arr数量加1,c1数组的下标k++。
                 arr[k]++;
                 k++;
         }
         for (int j = 0; j < k; j++) {
                 System.out.println(c1[j] + "个数是:" + arr[j]);
         }
}
给个建议,编程是讲究技巧的,程序写得太麻烦了,你看都没有人答复。就如同数学里面的计算题一样,你是喜欢拿着笔死算还是喜欢使用简便算法。我觉得这题是可以优化的。

评分

参与人数 1黑马币 +3 收起 理由
r1503882525 + 3 回答认真,排版好点就更好了,赞一个。.

查看全部评分

回复 使用道具 举报
看这个,上面的格式有点问题。兄弟,你好,你这个程序出问题的主要原因是:
c1数组、arr数组和c数组的长度是一样的,你都是使用i来进行存储。导致当出现重复字符时,c1数组里面默认为空,arr里面默认为0。
解决办法:
既然问题是c1数组和arr数组的长度不合理,所以需要重新定义一个变量k来规范这两个数组的长度,而不是使用i。
修改方法如下:
public static void main(String[] args) {
         String s = "wo111ai222heima";
         String regex = "\\d";
         String ss = s.replaceAll(regex, "");
         System.out.println(ss);
         char[] c = ss.toCharArray(); //woaiheima
         int[] arr = new int[99];//arr数组用于计数
         char[] c1 = new char[99]; //c1数组用于存放c数组中的字符,重复时不存储,但arr数组对应的元素+1
         int i = 0;
         int k = 0;//用来定义c1数组和arr数组的长度
         a:
        for (; i < c.length; i++) {      
                 for (int j = 0; j < k; j++) { //c1数组的长度为k
                         if (c1[j] == c) {//判断c1数组中是否有元素与a一致
                                 arr[j]++;//有,则与c1[]元素对应的arr元素+1,
                                 continue a; //并跳过本次外轮循环,进入下一次循环
                         }
                 }
                c1[k] = c; //不符合条件,c1数组进行存储,同时arr数量加1,c1数组的下标k++。
                 arr[k]++;
                 k++;

         }
         for (int j = 0; j < k; j++) {
                 System.out.println(c1[j] + "个数是:" + arr[j]);
         }
}
给个建议,编程是讲究技巧的,程序写得太麻烦了,你看都没有人答复。就如同数学里面的计算题一样,你是喜欢拿着笔死算还是喜欢使用简便算法。我觉得这题是可以优化的。
回复 使用道具 举报
系统有点问题,有一句需要更正。
c1[k] = c[i]; //不符合条件,c1数组进行存储,同时arr数量加1,c1数组的下标k++。
回复 使用道具 举报
枫叶红 来自手机 中级黑马 2016-8-14 12:11:54
8#
[quote]水月灬清影 发表于 2016-8-14 11:18
[mw_shl_code=java,true] public static void main(String[] args) {

         String s =

你这个逻辑有问题
回复 使用道具 举报
枫叶红 来自手机 中级黑马 2016-8-14 12:16:12
9#
[quote]水月灬清影 发表于 2016-8-14 11:18
[mw_shl_code=java,true] public static void main(String[] args) {

         String s =

应该在第一层循环定义一个int e =0,在内层循环里面的if 里让e=1,再在外层循环加一个if判断e是否=0,等于执行,不等于直接过
回复 使用道具 举报
aliali007 发表于 2016-8-14 11:47
兄弟,你好,你这个程序出问题的主要原因是:
c1数组、arr数组和c数组的长度是一样的,你都是使用i来进行存 ...

OK 了解了/~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马