试题描述

  • 问题详情如下图所示:
  • 要求:java实现数据结构知识
  • HDU1020--编码问题_System


参考代码

  • 比较垃圾,在别人基础上改的,懒得重构,,,仅供参考
import java.util.Scanner;

public class HDU1020StringEncoding {
    public int row;//行数T
    public char[][] data;//数据容器
    public char[] rowData = new char[20000];
    // 结构初始化构造
    public HDU1020StringEncoding(int row) {
        this.row = row;
        this.data = new char[row][10000];
    }
    // 载入数据,读取并存储
    public void loading( ) {
        for (int i = 0; i < this.row; i++) {
            Scanner scanner = new Scanner(System.in);
            String rowStr = scanner.nextLine();//第i行字符串
            int length = rowStr.length();//字符串分割
            for (int j = 0; j < length; j++) {
                char c = rowStr.charAt(j);
                this.data[i][j] = c;//入库
            }
        }
    }
    // 逻辑计算,并输出数据
    public void computed( ) {
        for (int i = 0; i < this.row; i++) {
            char[] chars = this.data[i];
            for (int j = 0; j < chars.length; j++) {
                char c = chars[j];
                if (c == '\0') {
                    break;
                }
                if(checkHave(c, j, chars)){
                    continue;
                }
                int number = computedNumber(c, chars);
                setRowData(number, c);
            }
            //第j行计算完毕
            for (char rowDatum : this.rowData) {
                if (rowDatum == '\0') {
                    break;
                }
                System.out.print(rowDatum);
            }
            //换行
            System.out.print("\n");
            this.rowData = new char[20000];
        }
    }
    public boolean checkHave(char c, int index, char[] arr) {
        for (int i = 0; i < index; i++) {
            if (arr[i] == c) {
                return true;
            }
        }
        return false;
    }
    //统计数目
    public int computedNumber(char c, char[] ar) {
        int size = 0;
        for (char c1 : ar) {
            if (c1 == c) {
                size++;
            }
            if (c1 == '\0') {   // 判断字符数组是否结束
                break;
            }
        }
        return size;
    }
    public void setRowData(int number, char c) {
        if (number == 0) {
            return;
        }
        if(number == 1) {   // 子串长度为1,不输出数字
            for (int i = 0; ; i++) {
                if (this.rowData[i] != '\0') {
                    continue;
                }
                this.rowData[i] = c;
                break;
            }
        }
        if (number>1) {   // 子串长度不为1,增加数字到字符数组
            for (int i = 0; ; i++) {
                if (this.rowData[i] != '\0') {   // 字符数组末尾判断
                    continue;
                }
                String str = String.valueOf(number);
                int len = str.length();
                for(int j=i; j-i<len; j++) {
                    this.rowData[j] = str.charAt(j-i);
                }
                this.rowData[i+len] = c;
                break;
            }
        }
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int row = scanner.nextInt();
        HDU1020StringEncoding hduse = new HDU1020StringEncoding(row);
        hduse.loading();
        hduse.computed();
    }
}
  • 测试效果


HDU1020--编码问题_HDU1020_02