为了账号安全,请及时绑定邮箱和手机立即绑定

计数数组的行为

计数数组的行为

回首忆惘然 2023-04-13 15:05:47
count 是 char 数组,它只存储字符。count[str.charAt(i)]++;上面一行到底发生了什么?count[str.charAt(i)] == 1char array 的整数如何与 char 进行比较?粘贴下面的代码以找出字符串中的第一个非重复字符。它绝对有效。谁能回答我上面提到的两个问题?class GFG {  static final int NO_OF_CHARS = 256;  static char count[] = new char[NO_OF_CHARS]; /* calculate count of characters     in the passed string */ static void getCharCountArray(String str)   {      for (int i = 0; i < str.length();  i++)      {  //System.out.println(count[str.charAt(i)]+"   Before");          count[str.charAt(i)]++;         // System.out.println(count[str.charAt(i)]+"   After");     } } /* The method returns index of first non-repeating    character in a string. If all characters are repeating     then returns -1 */static int firstNonRepeating(String str) {     getCharCountArray(str);     int index = -1, i;     for (i = 0; i < str.length();  i++)     {         if (count[str.charAt(i)] == 1)         {             index = i;             break;         }        }     return index; } // Driver method public static void main (String[] args) {     String str = "geeksforgeeks";     int index =  firstNonRepeating(str);     System.out.println(index == -1 ? "Either all characters are repeating or string " +                "is empty" : "First non-repeating character is " +  str.charAt(index)); } }
查看完整描述

3 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

因此,下面的代码将迭代 a 中的每个字符String,并根据字符的数值,由cameron1024 answer's解释,增加一个计数器。


for (int i = 0; i < str.length();  i++) 

{     //System.out.println(count[str.charAt(i)]+"   Before");

      count[str.charAt(i)]++; 

      // System.out.println(count[str.charAt(i)]+"   After");

}

好吧,理论上是因为您需要更新数组以正确递增:


count[str.charAt(i)] = count[str.charAt(i)]++; 


//Same as

char tmp = count[str.charAt(i)];

count[str.charAt(i)] + 1;

count[str.charAt(i)] = tmp; 

但也要使用正确的增量运算符,因为它会返回原始值而不是结果


count[str.charAt(i)] = ++count[str.charAt(i)]; 


//Same as

count[str.charAt(i)] = count[str.charAt(i)] + 1;

当然,你可以简化


for (int i = 0; i < str.length();  i++) 

{

    char c = str.charAt(i);

    count[c] = ++count[c]; 

}

甚至更好


for( char c : str.toCharArray())

{

    count[c] = ++count[c]; 

}


查看完整回答
反对 回复 2023-04-13
?
米脂

TA贡献1836条经验 获得超3个赞

根据 Oracle 的文档:

char 数据类型是单个 16 位 Unicode 字符。它的最小值为 > >'\u0000'(或 0),最大值为 '\uffff'(或 65,535)。

为此,您可以将其视为 16 位无符号(即正)整数。因此,代码char c = 1;等价于char c = (int) 1;,由于Java在类型之间的自动转换。这类似于 how long l = 1;,尽管1它是整数原语,因为 Java 语言理解您可能想要一个long而不是int.

因此,count[i] == 1它的行为就像您将 is 定义为一个int[],并检查该索引处字节的数值以查看它们是否相等1

相反,如果您尝试检查该索引是否包含字符1,您可以尝试count[i] == '1';(注意单引号,用于字符文字而不是字符串文字)。


查看完整回答
反对 回复 2023-04-13
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

两字节char可以扩展为四字节int(char)('a' + 1) == 'b''a' == 97

  1. char(一个 2 字节的 UTF16 值)已用作索引 ( count[str.charAt(i)]),将其扩展为 65_535 (0xFFFF) 的 0 之间的一个整数。

  2. char也被用于char[] count从 0 到 65_535 的计数 ( )。

所以有两个限制:

  1. 特殊字符很容易超过数组长度:0x20AC、0x2018 和0x2019。

  2. 如果str包含超过 65_535 个相同字符,则计数溢出。

该算法将更清晰:

Map<Character, Integer> count = str.chars()
    .mapToObj(char.class::cast)
    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

看起来好像在 C/C++ 中char被假定byte为历史上的 a 。然而,java 旨在处理字符串中的完整 Unicode,并且char是 UTF-16BE 格式的两个字节。所以java可以同时持有多个脚本。

计数[str.charAt(i)]++;

int j = (int')str.charAt(i);
count[j] = ((int)count[j]) + 1;

计数[str.charAt(i)] == 1

char ch = count[j];
(int)ch == 1


查看完整回答
反对 回复 2023-04-13
  • 3 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信