猿问

计数数组的行为

count 是 char 数组,它只存储字符。

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

上面一行到底发生了什么?

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

char 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)); 

}


回首忆惘然
浏览 106回答 3
3回答

至尊宝的传说

因此,下面的代码将迭代 a 中的每个字符String,并根据字符的数值,由cameron1024 answer's解释,增加一个计数器。for (int i = 0; i < str.length();&nbsp; i++)&nbsp;{&nbsp; &nbsp; &nbsp;//System.out.println(count[str.charAt(i)]+"&nbsp; &nbsp;Before");&nbsp; &nbsp; &nbsp; count[str.charAt(i)]++;&nbsp;&nbsp; &nbsp; &nbsp; // System.out.println(count[str.charAt(i)]+"&nbsp; &nbsp;After");}好吧,理论上是因为您需要更新数组以正确递增:count[str.charAt(i)] = count[str.charAt(i)]++;&nbsp;//Same aschar tmp = count[str.charAt(i)];count[str.charAt(i)] + 1;count[str.charAt(i)] = tmp;&nbsp;但也要使用正确的增量运算符,因为它会返回原始值而不是结果count[str.charAt(i)] = ++count[str.charAt(i)];&nbsp;//Same ascount[str.charAt(i)] = count[str.charAt(i)] + 1;当然,你可以简化for (int i = 0; i < str.length();&nbsp; i++)&nbsp;{&nbsp; &nbsp; char c = str.charAt(i);&nbsp; &nbsp; count[c] = ++count[c];&nbsp;}甚至更好for( char c : str.toCharArray()){&nbsp; &nbsp; count[c] = ++count[c];&nbsp;}

米脂

根据 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';(注意单引号,用于字符文字而不是字符串文字)。

慕娘9325324

两字节char可以扩展为四字节int。(char)('a' + 1) == 'b'和'a' == 97。char(一个 2 字节的 UTF16 值)已用作索引 (&nbsp;count[str.charAt(i)]),将其扩展为 65_535 (0xFFFF) 的 0 之间的一个整数。char也被用于char[] count从 0 到 65_535 的计数 ( )。所以有两个限制:特殊字符很容易超过数组长度:€0x20AC、‘0x2018 和’0x2019。如果str包含超过 65_535 个相同字符,则计数溢出。该算法将更清晰:Map<Character,&nbsp;Integer>&nbsp;count&nbsp;=&nbsp;str.chars() &nbsp;&nbsp;&nbsp;&nbsp;.mapToObj(char.class::cast) &nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.groupingBy(Function.identity(),&nbsp;Collectors.counting()));看起来好像在 C/C++ 中char被假定byte为历史上的 a 。然而,java 旨在处理字符串中的完整 Unicode,并且char是 UTF-16BE 格式的两个字节。所以java可以同时持有多个脚本。计数[str.charAt(i)]++;int&nbsp;j&nbsp;=&nbsp;(int')str.charAt(i); count[j]&nbsp;=&nbsp;((int)count[j])&nbsp;+&nbsp;1;计数[str.charAt(i)] == 1char&nbsp;ch&nbsp;=&nbsp;count[j]; (int)ch&nbsp;==&nbsp;1
随时随地看视频慕课网APP

相关分类

Java
我要回答