首页 > 试题广场 >

字符串归一化

[编程题]字符串归一化
  • 热度指数:15635 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
通过键盘输入一串小写字母 (a~z) 组成的字符串。
请编写一个字符串归一化程序,统计字符串中相同字符出现的次数,并按字典序输出字符及其出现次数。
例如字符串"babcc"归一化后为"a1b2c2"

数据范围:输入的字符串长度满足 ,保证输入中仅包含小写的英文字母

输入描述:
每个测试用例每行为一个字符串,以'\n'结尾,例如cccddecca


输出描述:
输出压缩后的字符串ac5d2e
示例1

输入

dabcab

输出

a2b2c1d1
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        HashMap<Character,Integer> map = new HashMap();
        for(int i = 0;i < str.length();i++){
            map.put(str.charAt(i),map.getOrDefault(str.charAt(i),0)+1);
        }
        Set set = map.keySet();
        Object[] arr = set.toArray();
        Arrays.sort(arr);
        StringBuffer output = new StringBuffer();
        for(int i = 0;i < arr.length;i++){
            output.append(arr[i] + "" + map.get(arr[i]));
        }
        System.out.println(output);
    }
}


发表于 2020-03-31 15:39:17 回复(0)
import java.io.*;
import java.util.HashMap;
import java.util.Map;

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String str = bf.readLine();
        Map<Character,Integer> map = new HashMap<>();
        StringBuilder sb = new StringBuilder();
        for(int i = 0;i < str.length();i++){
            if(map.get(str.charAt(i)) == null){
                map.put(str.charAt(i),1);
            }else{
                int temp = map.get(str.charAt(i)) + 1;
                map.put(str.charAt(i),temp);
            }
        }
        for(char des = 97;des < 123;des++){
            if(map.containsKey(des)){
                sb.append(des);
                sb.append(map.get(des));
            }           
        }
        System.out.println(sb.toString());
    }
}

发表于 2020-03-03 16:30:10 回复(1)
Java解法
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] count = new int[256];
        String s = scanner.nextLine();
        char[] array = s.toCharArray();
        for (char c : array) {
            count[c]++;
        }
        StringBuilder builder = new StringBuilder();
        for (int i = 'a'; i <= 'z'; i++) {
            if (count[i]!=0){
                builder.append((char)i);
                if (count[i]!=1)
                    builder.append(count[i]);
            }
        }
        System.out.println(builder.toString());
    }
}


发表于 2020-03-01 20:03:35 回复(0)
  • 存入HashMap中就行了,然后再遍历。至于这个顺序,HashMap就是按照abcdefg……来存放的,直接遍历map即可
    import java.util.*;
    public class Main
    {
      public static void main(String [] args)
      {
          Scanner sc=new Scanner(System.in);
          while(sc.hasNext())
          {
              String str=sc.next();
              HashMap<String,Integer> map=new HashMap<>();
              for(int i=0;i<str.length();i++)//遍历字符串
              {
                  char s=str.charAt(i);
                  String ss=""+s;
                  if(map.containsKey(ss))//如果键已经存在了
                  {
                      int value=map.get(ss);//通过键获取值
                      value=value+1;
                      map.put(ss,value);
                  }
                  else
                  {
                      map.put(ss,1);
                  }                       
              }
              Set<String> set=map.keySet();
              for(String key:set)
              {
                  int value=map.get(key);
                  System.out.print(key+value);
              }
          }
      }
    }
发表于 2020-02-13 23:47:01 回复(0)
package xiaozhao2.bytedance.kuaishou;

import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

public class guiyihua {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        TreeMap<Character, Integer> treeMap = new TreeMap<>();
        String str = sc.next();
        char[] chs = str.toCharArray();
        for (int i = 0; i < chs.length; i++) {
            treeMap.put(chs[i], treeMap.getOrDefault(chs[i], 0) + 1);
        }
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<Character, Integer> entry : treeMap.entrySet()) {
            sb.append(entry.getKey()).append(entry.getValue());
        }
        System.out.println(sb.toString());
    }
}
发表于 2019-09-13 14:24:01 回复(0)

糙方法简单实现了一下

import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
     public static  void main(String args[])
     {
         Scanner sc = new Scanner(System.in);
         String m=sc.nextLine();
         char arr[]=m.toCharArray();
         Map<Character,Integer>  map =new  HashMap<Character, Integer>();
         for(int i=0;i<26;i++)
         {
             char n =(char)(i+97);
             map.put(n,0);
         }

        for(int i=0;i<arr.length;i++)
        {
            for(Map.Entry<Character,Integer> entry:map.entrySet())
            {
                if(arr[i]==entry.getKey())
                {
                    //entry.getValue();
                    map.put(entry.getKey(),entry.getValue()+1);
                }
            }
        }
        for(Map.Entry<Character,Integer> entry1:map.entrySet())
        {
            if(entry1.getValue()!=0)
            {
                System.out.print(entry1.getKey());
                System.out.print(entry1.getValue());
            }
        }

     }
}


编辑于 2019-08-27 16:34:33 回复(0)
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        char[] chars=sc.nextLine().toCharArray();
        //经验,一般是用hashmap来统计出现次数的,
        //但本题是对字符统计次数,可以专门用一个counts数组来统计次数
        int[] counts=new int[26];
        for(int i=0;i<chars.length;i++){
            counts[chars[i]-'a']++;
        }
        for(int i=0;i<26;i++){
            char c=(char)('a'+i);
            int count=counts[i];
            if(count==0){
                continue;
            }else{
                System.out.print(c+""+count);
            }
        }
    }
}

发表于 2019-08-05 21:59:53 回复(0)
//使用字符类型可以做加减的特性,例如’a'-'a'=0。
//然后利用数组解决
private static String test(String line)
    {
        int size=line.length();
       int []arr=new int[26];
        for(int i=0;i<size;i++)
        {
            int index=(int)line.charAt(i)-(int)'a';
            arr[index]++;
        }
        String ret=new String();
        for(int i=0;i<26;i++)
        {
            if(arr[i]!=0)
            {
               ret+=(char)(i+'a');
               ret+=arr[i];
            }
        }
        return ret;
    }
发表于 2019-08-05 01:49:31 回复(0)