leetcode 브러시 노트 - Excel 목록 이름

2035 단어

제목 설명:


Excel 테이블에 해당하는 열 이름을 반환하는 양의 정수를 지정합니다.
예:
1:A
2:B
28:AB
701:ZY

문제 해결 방법:


이 문제는 leetcode에 표시된 것이 간단하기 때문에 나는 본래 그것이 청동인 줄 알았는데, 끝내 왕이 될 줄은 생각하지 못했다.오전 내내 연구했더니 머리가 굳어버렸지만 여전히 이해하지 못했다.남의 문제풀이를 보고 점심에 잠을 잘 때도 곰곰이 생각해 보니 결국 뒤죽박죽이 되었다.코드를 옮겨와서 제 이해를 말씀드리겠습니다.

AC 코드:

public String convertToTitle1(int n){
        String temp = "";
        while (n > 0){
            char s = (char)((n-1) % 26 + 'A');
            temp = s + temp;
            n = (n-1)/26;
        }
        return temp;
    }

처음에는 간단한 10진법이 26진법으로 바뀌는 문제인 줄 알았는데 몇 차례 벽에 부딪혀 보니 일이 이렇게 간단하지 않았다.
코드에 표시된 이 n-1 두 개를 주의하세요.
먼저 첫 번째 n-1을 보면 10진수 1~26은 알파벳 A~Z에 대응하기 때문에 A를 기점으로 할 때 숫자 n=1~26은 각각 0-25를 더하여 A~Z로 변하기 때문에 10진수를 토대로 1을 줄이고 모델을 취해야 한다.그러나chars=(char)(n%26+'A'-1)라고 쓸 수도 없고, 이렇게 쓰면 n이 26으로 나누어질 때'Z'로 계산해야 하는데, 이렇게 계산하면'A'-1='@'로 계산된다.
두 번째 n-1에 관해서는 이 excel 서열과 10진법의 차이를 알아차렸는지 모르겠습니다.10진법의 한 자리 채움은 열 자리보다 1이 적다. 즉, 한 자리 채움은 9이고 열 자리가 1일 때는 10을 대표한다.이 excel 서열은 AZ가 나타날 수 있는데 A는 26을 대표하고 Z는 26을 대표한다. 이것은 매우 매혹적이다. 여기는 27을 채우고 다시 진입하지만 진입하는 위치는 26을 대표한다.따라서 26의 배수, 예를 들어 52가 BZ로 변하는 것을 방지하기 위해 맨 마지막에 26이 하나 소모되었기 때문에 26에서 1위로 들어가기만 하면 된다.그래서 두 번째 n-1은 이런 상황을 방지하는 것이다.
사실 나는 결국 이 문제가 매우 혼란스러운 이유는 우리의 사고 관성에 부합되지 않기 때문이라고 생각한다.우리의 10진법, 2진법, 16진법 등은 모두 0이 있는데, 이 excel 서열은 0이 존재하지 않고, 1-26만 존재하며, 27이 되어서야 비로소 한 자리를 전진한다.
 
전재 대상:https://www.cnblogs.com/yingying7/p/11578855.html

좋은 웹페이지 즐겨찾기