zoukankan      html  css  js  c++  java
  • ACM 媛在努力 华山论剑

    媛在努力
    描述在多媒体数据处理中,数据压缩算法尤为重要。小媛上完课后就想自己发明一个数据压缩算法。她想呀想,终于想到一个方法。在多媒体数据中有很多数据都是重复的,所以她想把连续相同的数据用数据出现的次数和数据本身表示。例如:1 1 1 2 3 3 3 3 3  压缩后及为3 1 1 2 5 3(表示3个1,1个2和5个3)。有想法后小媛就希望把它用代码实现了。但是大家都知道小媛现在整天都忙着苦B的复习考研,连电脑都摸不到。所以她希望作为ACMer的你帮她写一下。输入输入包含多组数据,第一行一个数字T代表输入样例数。
    每组样例开始一个数M < 10^7表示这组数据中数字的个数,接下来M个数表示要被压缩的数字(数字都不超过int表示的范围)。输出每组测试数据输出一行数字对,如上面描述的一样。两个数字之间用一个空格隔开。样例输入
    1
    9 1 1 1 2 3 3 3 3 3 
    样例输出
    3 1 1 2 5 3
    public class Exam1208_1 {
    
        public static void main(String[] args) {
                    
            String str="1 1 1 2 3 3 3 7 7 7 7 9 3 3 3 3";
            
            //1 1 1 2 3 3 3 7 7 7 7 9 3 3 3 3
            //3 1 1 2 3 3 4 7 1 9 4 3
            
            int[] ins=toIns(str);
            int[] data=ins.clone(); //克隆一份数据保存起来
            
            //编程调试代码 
            for(int x:ins){
                System.out.print(x+" ");
            }
            System.out.println();
            
            
            ArrayList<String> arr=toArrayList(ins);
            
            String temp="";
            for(String s:arr){
                temp+=s;
            }
            System.out.println(temp);
            
            String[] strs=temp.split(",");
            for(String ss:strs){
                System.out.print(ss.length()+" "+ss.charAt(0)+" ");
                
            }
        
            
            
        }
        public static ArrayList<String> toArrayList(int[] ins) {
            //1 1 1 2 3 3 3 7 7 7 7 9 3 3 3 3 
            //1 2 3 7 9 3
            ArrayList<String> arr=new ArrayList<String>();
            arr.add(ins[0]+"");
            for(int i=1;i<ins.length;i++){
                if(ins[i]!=ins[i-1]){
                    arr.add(",");
                }
                arr.add(ins[i]+"");
            }
            return arr;
        }
        public static int[] toIns(String str) {
            String[] strs=str.split(" ");
            int[] ins=new int[strs.length];
            for(int i=0;i<strs.length;i++){
                ins[i]=Integer.parseInt(strs[i]);
            }
            return ins;
        }
    }
    代码2:
    public class YuanZaiNuLi {
    
        public static void main(String[] args) {
            int[] arr=new int[]{1,1,1,2,3,3,3,3,3,1,1,2}; //5 1 3 2
            Me(arr,9);
        }
        public static void  Me(int[] arr,int n){
            int count=1;
            int num=0;
            for(int i=0;i<arr.length;i++){
                num=arr[i];
                if(i==arr.length-1){
                    System.out.print(count+" "+num);
                    break;
                }
                if(num==arr[i+1]){
                    count++;                    
                }
                if(num!=arr[i+1]){
                    System.out.print(count+" "+num+" ");
                    count=1;    
                }
                    
            }
        }
    }
    媛在努力另一种方式,按大小排序,统计所有重复的并在前面统计重复的次数,并放在数组中。
    例如 1 1 1 2 2 9 2 2 1
    输出 4 1 4 2 1 9
    代码:
    public class Text1 {
    
        public static void main(String[] args) {
            String str = "9 2 1 1 1 2 3 3 3 3 3 3";// 测试一组数据
            System.out.println(method(str));
        }
        public static ArrayList<Integer> method(String str) {
            String[] array = str.split(" ");// 拆分
            int[] arr = new int[array.length];
            for (int i = 0; i < array.length; i++) {
                arr[i] = Integer.parseInt(array[i]);// 字符串数组转整型数组
            }
            Arrays.sort(arr);// 数组排序
            ArrayList<Integer> list = new ArrayList<Integer>();
            for (int i = 0; i < arr.length; i++) {
                list.add(arr[i]);// 数组放集合里面
            }
            int count = 0;
            for (int i = 0; i < list.size() - 1; i++) {
                for (int j = list.size() - 1; j > i; j--) {
                    if (list.get(j).equals(list.get(i))) {
                        list.remove(j);// 去除重复的数
                        count++;
                    }
                }
            }
            int listcount = arr.length - count;// 去重之后集合的长度
            int sum = 0;// 统计个数
            int[] ar = new int[listcount];
            for (int i = 0; i < listcount; i++) {
                for (int j = 0; j < arr.length; j++) {
                    if (list.get(i) == arr[j]) {
                        sum = sum + 1;
                    }
                }
                ar[i] = sum;//把重复的数放在数组里
                sum = 0;
            }
            for (int i = 0; i < listcount; i++) {
                list.add(i * 2, ar[i]);//把数组里面的数添加到集合每个元素的前面
                }
            return list;
        }
    }
    华山论剑
    描述
    有n个剑客(编号1~n)相约华山比剑,分 m 次决斗,为了节省时间,每次决斗编号在[l,r]的剑客一起决斗,然后xi获胜。当进行下一次决斗,失败后的剑客可能再参与到决斗,m 次决斗后可能不止一位获胜者(没有失败过就视为获胜者)。
    输入多组测试数据。
    对于每组测试数据,第一行输入n和m。接下来输入m行,每行输入l,r,xi。
    2 ≤ n ≤ 3*10^5; 1 ≤ m ≤ 3*10^5,l ≤ xi ≤ r输出每组测试数据输出n个数字,数字间用空格隔开。第i个数子表示第一次击败i号剑客的剑客编号,若i号剑客是最后的获胜者,输出0;样例输入
    3 2
    1 2 2
    1 3 2
    样例输出
    2 0 2
    public class Exam1208_3 {
    
        public static void main(String[] args) {
            //3 2
            //1 2 2
            //1 3 2
            //2 0 2(第一次击败i好选手的选手)
            
            /*
            5 3
            2 4 3
            1 3 2
            1 5 4
            
            2 3 2 3 4
            
            5 2
            3 5 4
            2 5 4
            0 4 4 0 4
            
            */
            
            int n=5; //n个剑客
            int m=3; //m次决斗
            
            int[][] inss={
                    {2,4,3},
                    {1,3,2},
                    {1,5,4}
            };
            for(int i=1;i<=n;i++){
                getResult(inss,i);
            }
            
        }
        public static void getResult(int[][] inss,int x){ //对于n个剑客,m次决斗
            //击败第i个选手的选手
            z:
            for(int i=0;i<inss.length;i++){
                for(int j=0;j<inss[i].length;j++){
                    if(x==inss[i][j] && inss[i][inss[i].length-1]!=x){
                        System.out.print(inss[i][inss[i].length-1]+" "); //取得最后一个数
                        break z;
                    }
    //                else if(x==inss[i][j]){ //如果第i个选手没有被击败过,输出0
    //                    System.out.print(0+" ");
    //                    break z;
    //                }
                }
            }
            
            //找不到 +0
        }
        
        public static int[] toIns(String str) {
            String[] strs=str.split(" ");
            int[] ins=new int[strs.length];
            for(int i=0;i<strs.length;i++){
                ins[i]=Integer.parseInt(strs[i]);
            }
            return ins;
        }
    }
    
    
  • 相关阅读:
    vs2008及以上的ActiveX测试容器在哪儿
    关于databinding的细节
    C#使用StackTrace获取方法被谁调用
    你是怎么走神的?
    怎样让SoapHttpClientProtocol不使用系统默认代理
    List的FindIndex和ForEach
    List的Capacity
    装箱和拆箱
    FileSystem.DeleteDirectory遇到"无法删除 文件:无法读取源文件或磁盘"
    一段关于测试和自定义Attribute的代码
  • 原文地址:https://www.cnblogs.com/w-xibao/p/8018675.html
Copyright © 2011-2022 走看看