剑指offer打卡day07:第一个只出现一次的字符

题1:第一个只出现一次的字符

题目描述

在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)

示例

输入

"google"

返回值

4

解析:

  • 遍历计数:

    • 对于计数问题可以用传统的count++计数,但是这样效率太低,因此可以创建数组当计数器

      • index 保存元素, value 保存次数
    • 牛客网剑指offer算法题打卡——day04 中的用数组优化求斐波那契数列的方法

    • 相关面试题:

      @Test
      public void array_count(){
          /**
            * 找出arr中各元素出现的次数:
            */
          int[] arr = {1,4,1,4,2,5,4,5,8,7,8,77,88,5,4,9,6,2,4,1,5} ;
          //上述数组最大值为88,因此可以创建一个容量为100的数组计数器
          int[] count_array = new int[100];
          //遍历目标数组,用index对应元素,用value自增来计数
          for (int i = 0; i < arr.length; i++) {
              count_array[arr[i]]++;
          }
          for (int i = 0; i < count_array.length; i++) {
              if (count_array[i] != 0){
                  //当value不等于数组初始值0时,说明有值,此时打印index(元素)+value(次数)即可
                  System.out.println(i+" 出现了:"+count_array[i]+"次");
              }
          }
      }
      
      1 出现了:3次
      2 出现了:2次
      4 出现了:5次
      5 出现了:4次
      6 出现了:1次
      7 出现了:1次
      8 出现了:2次
      9 出现了:1次
      77 出现了:1次
      88 出现了:1次
      
  • char字符与Ascii码

    • ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符。

      在英语中,用128个符号编码便可以表示所有,但是用来表示其他语言,128个符号是不够的。

    • 扩展:java中int与char之间的互相转化

      @Test
      public void testAscii(){
          char c = 103;
          System.out.println((char) c);//输出:g  (g的ascii码为103)
          System.out.println((int) c);//输出:103  (直接转数字)
      }
      
    • 打印128个Ascii码

       @Test
          public void printACSII(){
              char a=0;
              String str = "";
              while(a<128){
                  str += a;
                  str+=",";
                  a++;
              }
              System.out.println(str);
          }
      
       ,,,,,,,,	,
      ,,,,,,,,,,,,,,,,,,, ,!,",#,$,%,&,',(,),*,+,,,-,.,/,0,1,2,3,4,5,6,7,8,9,:,;,<,=,>,?,@,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,[,\,],^,_,`,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,{,|,},~,,
      

      在控制台打印会出现乱码,百度后得:

      ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符 [1] 。其中:

      *0~31及127(共33个)是控制字符*或通信专用字符(其余为可显示字符),**如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响 [1] 。

      32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。

      65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

  • 扩展阅读:

解答:

public int FirstNotRepeatingChar(String str){
    //判空
    if(str.length() == 0){
        return -1;
    }
    //字符串由字母组成因此范围为0~128,创建数组计数容器
    int[] ints = new int[128];
    //用计数容器的index对应元素,value计数
    for (int i = 0; i < str.length(); i++) {
        ints[str.charAt(i)]++;
    }
    //用同样字符顺序遍历,首次当只出现value为1即满足要求
    for (int i = 0; i < str.length(); i++) {
        if (ints[str.charAt(i)] == 1){
            return i;
        }
    }
    return -1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值