• 计算字符串中每个字符出现的个数


      方法不难,但是最近在看哈希表,队散列法有了一定的认识,突然觉得解决这个问题的方法认识应该提高,

    首先分析问题,要统计一个字符串每个字符出现的次数,那么绝对是要遍历整个字符串,这个问题的难点在于怎么确认

    当前字符是否在前面已经出现,不能取一个字符就与整个字符串一一对比,这样的时间复杂度就是O(n^2)。

      解决方法:可以把字符转换成对应的整数,这个过程类似于获得哈希值,然后如果在出现这个字符就直接把哈希值地址保存的变量加一,

    遍历之后就可以得到每一个字符出现的次数。具体代码如下

    char* str = "1234fhasfhdsffffffffaafdskajhfcacjkldsjfdsjakf";
    int StringGetIndexNum(char* str,char character)
    {
        int buff[256];
        while(*str !=''){
            printf("%c,%d
    ",*str,(int)*str);
            buff[(int)*str]++;
            str++;
        }
        printf("字符[%c]出现的次数是:[%d]
    ",character,buff[(int)character]);
        return 0;
    }

    解释一下。这里给定的字符串必须是ascii码范围的字符,中文字符无效。无法统计,定义一个256大小的数组保存字符出现的次数(ascii码范围),

    (int)*str,获得的是字符对应的ascii码,将ascii码当做数组下标,然后数组值累加。这个是一个典型的空间换时间的方法,因为申请的256个空间不是每一个都用到。

    同样的原理可以用java实现:

    public static void main(String[] args) {
            // TODO Auto-generated method stub
            String string = "112fjdsajjsafidsafsalfdsa";
            HashMap<Byte, Integer> hashMap = new HashMap<>();
            byte[] ArrayChar = string.getBytes();
            for (byte b : ArrayChar) {
                if(hashMap.get(b) == null){
                    hashMap.put(b, 1);
                }else{
                    hashMap.put(b, hashMap.get(b)+1);
                }
                
            }
            System.out.println("j:"+hashMap.get("f".getBytes()[0]));
        }

    使用hashMap保存字符与出现的次数,byte[] ArrayChar = string.getBytes();类似于取得字符的哈希值,然后对哈希值进行遍历,统计次数。

    这个只不过是自己的流水账,偶尔有一些心得,错误的地方概不负责
  • 相关阅读:
    Bozh 的技术博客 梦想成为Gnu/Linux | Unix后台架构师 | Read the fucking source code
    Welcome to the TANGO website
    repowatcher : about
    PyTango documentation — PyTango 8.0.2 documentation
    Visual Studio 2010旗舰版正式版序列号 civilman的专栏 博客频道 CSDN.NET
    BoostPro Binary Installer for Visual C++
    分享:httping 1.5.6 发布,HTTP 诊断工具
    浅析epoll – epoll函数深入讲解 C++爱好者博客
    分享:Jython动态加载Jar
    News BoostPro Computing BoostPro
  • 原文地址:https://www.cnblogs.com/ashitaka/p/5973631.html
Copyright © 2020-2023  润新知