day8 HJ4 字符串分隔

183 阅读5分钟

题目来源: HJ4 字符串分隔

题目描述:

image.png

思路

如果字符串的字符个数小于8,则直接补全输出;如果字符串的字符个数大于8,那么先将可以成套输出(8个一组)的部分输出,最后的部分,补全后输出

具体实现:

import java.text.DecimalFormat;
import java.util.Scanner;

public class  Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        int n = str.length()/8;
        char[] chars = new char[(n+1)*8];
        if(str.length()<8){
            System.out.println((str+"00000000").substring(0,8));
            return ;
        }
        for(int i = 0; i < str.length(); i ++){
            char charAt = str.charAt(i);
            chars[i] = charAt;
        }


        for(int i = 0;i < 8 * n; i++){
            System.out.print(chars[i]);
            if((i+1) % 8 == 0){    //第8个坐标为7,如果是if(i != 0 && i % 8 == 0),第9个就会与前8个在同一行
                System.out.println();
            }
        }
        if(str.length()%8 != 0 ){
            String str1 = new String(chars,8 * n,str.length()%8);
            System.out.println((str1+"00000000").substring(0,8));
        }

    }
}

思路杂记

1.对于char[] chars = new char[(n+1)*8],其实(n+1)*8并没有什么作用,最初的想法是在数量上按照8个一组进行补全,所以如果后续有需要计算补全后的长度,那么直接使用chars.length即可。

2.第一个if判断,就是思路中的字符个数小于8的情况,简单粗暴的在str后面+"00000000",然后通过public String substring(int beginIndex, int endIndex)返回字符串的子字符串,beginIndex是起始索引(包括), 索引从 0 开始;endIndex是结束索引(不包括)。

因为beginIndex是从0开始,endIndex又不包括在内,所以可以将endIndex这个参数简单粗暴的看作是需要获得的字符串中子字符串的个数

3.正如代码中的注释,对于第2个for循环中的if语句,最初的想法是if(i != 0 && i % 8 == 0),因为i是从0开始的,所以if语句中需要i != 0,否则就会出现图1的情况,第1个字符独占一行,由于if语句在i == 0时是TRUE,输出了System.out.println(),所以第一组的后7个就会在第二行。

添加上i != 0,如果字符个数≤8是没有问题的,但是,如果超过8个,就会出现新的问题:而根据输入的字符个数不同(8个一组,与满足几组有关),会有不同的错误输出情况,这里只讲一下8<个数<16以及16<个数<24的情况

  • 对于前者,由于if语句外层的for循环中的i < 8 * n,所以当8<个数<16时,n=str.length()/8 == 1,所以当i==8时,无法通过for语句中的i < 8 * n,也就不会执行if语句中的System.out.println(),就会出现图2的情况,后面添加那么多0,是代码中最后一个if语句的效果,正确的输出是:前8个字符第一行,第9个字符后面添加7个0处于第2行,由于没有执行System.out.println(),就没有完成换行的功能
  • 对于后者,出现一个新情况,发现第9个字符与前8个字符处于同一行,如图3,这是因为第8个字符坐标为i==7,而if(i != 0 && i % 8 == 0),第9个的坐标i == 8,所以if条件成立,会在第9个字符后执行System.out.println(),由于for循环中是先输出字符,后if判断,所以就会将第9个字符先进行输出,这样第9个与前8个在同一行,然后进行换行;至于输出部分的第二行的错误情况,与8<个数<16是同理的,因为此时n=str.length()/8 == 2,可以根据上面对8<个数<16的分析,进行理解

image.png

4.对于最后一个if语句,用到了String类中构造方法String(char value[], int offset, int count),offset表示第一个被截取的字符在数组value[]中的下标,count表示从此字符开始向后截取的字符的数量,理解为将value[]数组按照传入的下标和指定的截取数组数据的数量进行截取,并且创建一个内容为此的string对象

5.最后一个if语句,它的功能就是将原字符串中不够8个的字符,进行添加0,还可以用另一种方法实现

if(str.length()%8 != 0 ){
    DecimalFormat decimalFormat = new DecimalFormat("0.0000000"); //后添加0    
    String str1 = decimalFormat.format(Integer.valueOf(new String(chars,8 * n,str.length()%8)));
    System.out.println(str1.replace(".","").substring(0,8));
}

上述代码其实就是先通过decimalFormat.format完成字符串后面添加0,由于多了一个小数点,再通过replace将小数点去掉,最后使用substring返回符合个数的子字符串

JAVA字符串前补零和后补零的快速方法

    1. 数字字符串替换方法:
        String str= "123456";
        System.out.println("================  前补零方法1   =================");
        DecimalFormat decimalFormat=new DecimalFormat("0000000");
        String startZeroStr = decimalFormat.format(Integer.valueOf(str));
        System.out.println("前补零方法一:"+startZeroStr);

        System.out.println("==前补零 方法2,此方法不能对非数字字符串替换==");
        startZeroStr = String.format("%07d",Integer.valueOf(fileName));
        System.out.println("前补零方法二:"+startZeroStr);

        System.out.println("================  后补零 方法1  =================");
        DecimalFormat decimalFormat1=new DecimalFormat("0.000000");
        String endZeroStr = decimalFormat1.format(Integer.valueOf(fileName));
        System.out.println("后补零:"+endZeroStr);
        System.out.println("虽然后补零出现这种情况,带有小数点");
        System.out.println("比如你要长度要在7位以内,可以这么做");
        System.out.println("后补零转变后:"+endZeroStr.replace(".","").substring(0,7));

其中,后补零,还可以像这道题前面的方法:就是后边多补几个零,然后截取就行了

    System.out.println((str+"00000000").substring(0,8));
  • 2.非数字字符串前补零: 对非数字字符串前补零,用%4d替换肯定是不行的,因为%d对应的就是数字格式,如果想对AA字符串前补零到4位,可以这样写:先对字符串转,以空格补满位数,然后再将空格整体替换为目标0
    String.format("%4s", "AA").replace(" ","0")  
    //%4s中的4:填充为4位,对于不够的地方,%s是字符串,填充的是空格,所以需要用replace替换
String.format 传入 %XYd 的意思,拆解如下:  
%d :正常输出十进制数                     
%Yd:十进制数,输出 Y 位。如果本身大于 Y 位,正常输出  
%XYd:十进制数,输出 Y 位,不足 Y 位就补 X 。如果本身大于 Y 位,正常输出

相关知识点,可以搜索Java占位符使用