题目:给定字符串J?代表石头中宝石的类型,和字符串?S代表你拥有的石头。?S?中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
J?中的字母不重复,J?和?S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/probl...
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
int numJewelsInStones(char* J, char* S)
{
int w[58] = {0};
int count = 0;
char ch;
while(ch=*J++)
{
w[ch-'A']++;
}
while(ch=*S++)
{
if(w[ch-'A'])
count++;
}
return count;
一个简单的查找问题,这里使用了hashmap 的方法,对减少了查找的时间, 我的 问题是 :
ch=*J;
w[ch*-'A'];
int w[58];
char ch;
- 为什么: 可以将 char 类型的 ch 作为下标;
- 还有一个问题 : ch-'A' 得到的是对应的ASCII 的码值差;
那 ch-'0' 对应的是该字符的ASCII 码值 但是我今天在直接使用这个表达式求字母对应的码值是却不正确?
希望大神们帮我解释一下。
为什么: 可以将 char 类型的 ch 作为下标;
- integer type 都可以做下标。包括
char
,short
,int
,long
,long long int
,enum
, 等等。 -
'A'
的类型是int
,不是char
。 -
ch - 'A'
的类型也是int
,不是char
。
那 ch-'0'
对应的是该字符的ASCII 码值
'0'
和 0
('\0'
) 不是一个东西。前者其实不是0
。
ch-'0'
得到的也是对应的 ASCII 码差值,但是 '0'
的 ASCII 码值不是 0
。
没看你的题目,直接回答你的为什么。
- 为什么可以将 char 类型的 ch 作为下标?
答:因为 char 会被自动转为 int 类型,转出的值就是这个字符的 ASCII 码。
- ......那 ch-'0' 对应的是该字符的 ASCII 码值,但是我今天在直接使用这个表达式求字母对应的码值是却不正确?
答:
ch - '0'
对应的不是该字符的 ASCII 码值。如果ch 等于 '5'
,那么ch - '0'
等于整数类型 5。
- 因为 char 类型是 整数类型,整数类型都可以作为下标。有些编译器可能会警告
-
ch-'A'
是 ch 与 字符 A 的 ASCII码差值;ch-'0'
是 ch 与 字符 0 的 ASCII码差值;ch 本身就是 ASCII值,你也是认为是ch-0
char 类型可以无损转换成 int 类型,因此可以作为数组的下标。
例如,a
字母对应的数字为 97,b
对应的为 98,两者之差 b - a
为 1,不过 1 没有对应的字母。