210113 TIL

Jung·2021년 1월 13일
0

TIL

목록 보기
1/16

int 의 크기는 4byte로 32bit(1byte는 8비트)의 크기를 갖는다. 총 2^32개의 숫자를 표현할 수 있다는 뜻이다. 2^32개를 음의 정수, 0, 양의 정수로 나눠가져야하므로, int가 표현할 수 있는 범위는 다음과 같다.
[-2^31, 2^31-1] (약 -20억~20억)
(0도 세야하므로 최댓값은 2^31에서 하나 작은 수이다.)

최대최솟값은 외울 필요 없고 java에서 Integer Class를 통해 값을 확인할 수 있다.

System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);

만약 이 최대값을 벗어나는 범위의 숫자가 int에 저장되게 되면, 다시 최댓값을 넘긴 부분(나머지)이 ~~최솟값부터 다시 카운트 되어(불확실) ~~이상한 값이 저장된다. 이것을 오버플로우라고 한다.

알고리즘 문제를 예로 들어보자

int a = 1000000000;
a =10*a +3 ;
System.out.println(a);

a에 10억이 담겼으므로, 10배하면 100억을 넘겨 이미 int의 범위를 넘어선다. 다만 a 값을 프린트하더라도 오류가 나는 것이 아니라, int범위를 넘어선만큼 최솟값부터 다시 세어 a 에 저장하므로, 프린트는 제대로 된다.

a연산이 int 범위를 넘어설 경우를 캐치하기 위해선 다음과 같이 하면 된다.

a == (10*a+3)/10 

를 비교한다.
만약 연산 후에도 int 범위 내에 제대로 저장되었다면, 연산값인 (10*a+32) 를 10으로 나눈 값이 a 와 일치할 것이다.

a=7; 이라고 치면, 107+3 =73, 73/10 = 7(int이므로 나머지 버림)이므로 일치한다.
(또는 (10
a+3)/10 = a+0.3 이므로 소수값 버리면 a가 되므로)
그렇지만 연산값이 int로 표현되는 최댓값을 넘어서 overflow가 발생한다면 이상한 수가 나와 양변이 일치하지 않게 될 것이다


    ListNode tmp1 = head;

    while(tmp1!=null) {
        if(tmp1.val == tmp1.next.val ){
            tmp1.next = tmp1.next.next;
        }else{
            tmp1=tmp1.next;
        }
    }
    return head;
    
    ```

기존 코드의 문제점: tmp1을 계속 next 노드로 옮겨가더라도, 절대
tmp1 =null;이 될 수 없다. 존재하는 노드기에.
따라서 tmp1.next == null 이 되면 break 해주는 코드를 추가해야 한다. 링크드리스트의 마지막 노드까지 왔으므로 종료해줘야한다.



---------------------------------------


if(조건문) return answer;
-

메소드 끝나고 answer return 하는 것이므로 다른 answer return할 경우를 else문으로 따로 빼지 않아도 됨.

while(조건문){
return true;
}
return false;
의 경우에도 while조건문이 충족됨에 따라 true return 하고 메소드 마치는 것. return true가 실행되면 그 아래 return false는 실행되지 않는다. 


-----------------------------------------

String str = "0123456789";
String substr = "";


substr = str.substring(1, 3);
System.out.println("substring = " + substr);

출력 결과
12

인덱스 1이상, 3미만까지 1~2인덱스만 출력

0개의 댓글

관련 채용 정보