![](/img/trans.png)
[英]I just tried this code in java and here is my output 011. Can anyone please explain me how this happend
[英]Can anyone please use of charAt here in this java code and why 'A' is used
給定在Excel工作表中顯示的列標題,請返回其對應的列號。任何人都可以解釋此語句的作用
result = result * 26 + (s.charAt(i) - 'A' + 1)
該代碼在下面共享
int result = 0;
for (int i = 0; i < s.length(); result = result * 26 + (s.charAt(i) - 'A' + 1), i++);
return result;
字符串標題=“我的標題”;
System.out.println(title.charAt(3)); //Prints 't'
System.out.println(title.charAt(4)); //Prints 'i'
使用'A'的原因是它已更改為十進制值,您可以在ascii表( http://www.asciitable.com/ )上看到它。 在這里您可以看到“ A” = 65。
如果您想知道為什么使用結果,則應該了解for循環的作用:這是for函數的用法;
for(part1; part2; part3) //Head
{
//Body
}
在頭部,我們分為三個部分:
當for開始時,par1僅執行1次。
part2是在每個循環開始之前執行的條件。
part3在每個循環之后執行,通常是一個計數器或使循環最終停止的東西
所以最后我們得到一個例子:
String hello = "Hello world";
for(int i = 0; i < hello.length(); i++){
System.out.println(hello.charAt(i));
}
循環1:i = 0控制台:“ H”
循環2:i = 1控制台:“ e”
循環3:i = 2控制台:“ l”
循環4:i = 3控制台:“ l”
循環5:i = 4控制台:“ o”
循環6:i = 5控制台:“'
循環7:i = 6控制台:“ w”
循環8:i = 7控制台:“ o”
循環9:i = 8控制台:“ r”
循環10:i = 9控制台:“ l”
循環11:i = 10控制台:“ d”
在您的示例中,您必須找到for循環的每個部分,並按照與我所做的相同的方式進行操作,以了解它如何隨時間推移而發展。
第1部分:int i = 0;
第2部分:i <s.length();
第3部分:結果=結果* 26 +(s.charAt(i)-'A'+ 1),i ++;
身體:空!
如您所見, 在第3部分中我們有2條指令 ,因此它們都在每個循環之后執行,但這與執行操作相同。
for(int i = 0; i < s.length(); i++){
result = result * 26 + (s.charAt(i) - 'A' + 1);
}
我希望這有幫助
此代碼將由大寫字母組成的字符串編碼為整數。
假設我使用以下表示形式(1,0,1)2
表示二進制數字5,表示二進制數字。 如果我想用十六進制表示10,它將是(10)16
而不是A
十六進制的數字18將是(1,2)16
,依此類推。
該代碼的作用是在字符串上逐個字符地編碼,並在基數26中用數字替換每個字母。字母“ A”由1表示,“ B”由2表示,依此類推,直到“ Z”為26。因此字符串“ ABC”將表示為(1,2,3)26
,等於1 * 26 ^ 2 + 2 * 26 + 3 = 731。
到目前為止還不錯,但是有一個陷阱。 每個位置上可能的數字位數為26,但字母將替換為1到26,而不是0到25,這將使用所有可用數字。 結果是字母Z不能在其對應的數字內表示,並以“進位1”轉到緊鄰的較高數字。
讓我舉例說明。 字符串“ AY”表示為(1, 25)26
。 但是“ AZ”為(1,26)26
,實際上是(2,0)26
。
但是零不一定表示Z。字符串“ AYZ”表示為(1,25,26)26
,實際上是(1,26,0)26
,實際上是(2,0,0)26
。
但是我不確定'B'-'A'部分。
Java語言規范寫道:
整數類型為
byte
,short
,int
和long
,其值分別為8位,16位,32位和64位有符號的二進制補碼整數,以及char,其值為16位無符號整數代表UTF-16代碼單元(第3.1節)。
那么大寫拉丁字符的UTF-16代碼單元是什么? 這些字符是Basic Latin Unicode Block的一部分,該塊方便地按字母順序將它們緊挨着包含。 也就是說, 'A' + 1 == 'B'
, 'A' + 2 == 'C'
,並且'A' + i - 1
是拉丁字母的第i個大寫字符。 相反,給定任何大寫拉丁字符x,我們可以找到x - 'A' + 1
'A x - 'A' + 1
序數。
因此,如果我們只有26個excel列,則x - 'A' + 1
'A x - 'A' + 1
將找到標記為x的列的序數。
接下來的26列從“ AA”標記為“ AZ”,接下來的標記為“ BA”標記為“ BZ”,依此類推,直到“ ZA”標記為“ ZZ”。 因此,
ordinal(s) == 26 * ordinal(s.charAt(0)) + ordinal(s.charAt(1))
將其概括為任意標簽長度留給讀者練習:-)
算術運算僅對數字基元執行, short
和char
除外,它們會自動擴展為int
,算術結果也是int
。
減去字母A
可得到字母在字母中從零開始的索引,即'A'
為0, 'B'
為1等
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.