알고리즘 day
배열이 주어지고, 요소들의 합으로 만들어진 target이 주어진다.
해결방법은 하나 뿐, 요소는 한번만 쓰일 수 있다.
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] result = new int[2];
for (int i = 0; i < nums.length - 1; i++) {
for (int j = 1; j < nums.length; j++){
if(target == nums[i] + nums[j] && i != j){
result[0] = i;
result[1] = j;
return result;
}
}
}
return null;
}
}
32bit 정수 , 뒤집혀서 출력
는 int 범위 안, 범위를 벗어나면 return 0
class Solution {
public int reverse(int x) {
int result = 0;
String str = String.valueOf(Math.abs(x));
String reversedStr = "";
for (int i = str.length() - 1; i >= 0; i--) {
reversedStr += str.charAt(i);
}
try {
return result = x > 0 ? Integer.valueOf(reversedStr) : Integer.valueOf(reversedStr) * -1;
} catch (NumberFormatException e) {
return 0;
}
}
}
Integer.valueOf() 부분에서 reversedStr 이 정수 범위를 벗어나게 되면 오류가 발생해서 이부분에서 헤매었다. → 예외처리로 해결
찾아보니 Integer.MAX_VALUE, Integer.MIN_VALUE 라는 것이 있다.
정수의 최대값과 최소값을 바로 얻을 수 있다.
StringBuffer 사용, for문 사용 두가지 방법이 있다.
for (int i = str.length() -1; i>=0; i--) {
System.out.print(str.charAt(i));
}
Remove Duplicates from Sorted List - LeetCode
주어진 정렬된 링크드 리스트에서 중복된 값을 제거한다.
결과값도 정렬된 링크드 리스트이어야 함
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode current = head;
while(current != null && current.next != null){
if(current.val == current.next.val){
ListNode tmp = current.next;
current.next = tmp.next;
} else current = current.next;
}
return head;
}
}
while(current.next ! = null) 부분에서 NullPointerException 이 뜬다.
→ while(current != null && current.next != null) 로 변경하니 해결됨
solution을 살짝 봤는데 return head; 인데 왜 head 를 리턴하는지... 몰랐었는데 알겠다. 어차피 head 뒤에 next 들이 연결되어 있으니까!
처음에 current = curret.next; 를 else로 안했는데 꼭 else로 묶어주어야 한다.
처음에 if 구문에서 겹치는 노드를 없애고, current가 다음 칸으로 옮겨져서 다음 칸에서 또 next의 val 과 비교하는 것을 수행해야 한다고 생각해서 else 구문을 else 로 감싸지 않고 그냥 넣었다.
노트에 그림을 그려보니, 같은 val 를 가진 노드가 2개보다 더 많을 수 있는 경우에는 current 가 다음 칸으로 넘어가지 않고, next 랑 또 비교를 해주어야 같은 val을 가진 노드가 3개 혹은 그 이상일 때도 그 노드를 없앨 수 있다는 것을 이해했다.
따라서, else 로 감싸주어야 한다.
예) [1, 1, 1, 2, 2] 그림그려서 해보기
class Solution {
public boolean isPalindrome(int x) {
String str = "" + x;
String reversedStr = "";
for(int i = str.length()-1; i >= 0; i--){
reversedStr += str.charAt(i);
}
if(str.equals(reversedStr)) return true;
else return false;
}
}
Longest Common Prefix - LeetCode
주어진 String 들 중 공통 접두사 찾기
추상 클래스와 인터페이스의 공통점은?
추상 클래스와 인터페이스의 차이점은? (면접 문제로 출제된 적 있음)
추상 클래스는 생성자, 멤버변수를 갖고 있는 일반 클래스에 추상메서드를 포함하고 있는 것
인터페이스는 추상 메서드의 집합, 상수와 추상메서드만 가질 수 있음
인스턴스 변수와 인스턴스 메서드, 생성자를 가질 수 없다.
(단, jdk1.8 부터는 static 메서드와 default 메서드를 추가할 수 있다. 하지만 원래 규칙도 알아야 함)
interface 키워드
상수만 선언 가능, 무조건 public static final 이기 때문에 제어자를 생략할 수 있다.
→ 멤버변수(cv, iv)는 가질 수 없다.
메서드는 무조건 public abstract 이어야 하며, 제어자 생략 가능
(단, JDK1.8 부터는 static메서드와 default 메서드 포함 가능)
public class Practice {
public static void main(String[] args) {
Fighter f = new Fighter();
if(f instanceof Unit) System.out.println("f는 Unit의 자손입니다.");
if(f instanceof Fightable) System.out.println("f는 Fightable 인터페이스를 구현하였습니다.");
if(f instanceof Movable) System.out.println("f는 Movable 인터페이스를 구현하였습니다.");
if(f instanceof Attackable) System.out.println("f는 Attackable 인터페이스를 구현하였습니다.");
if(f instanceof Object) System.out.println("f는 Object의 자손입니다.");
}
}
class Fighter extends Unit implements Fightable {
@Override
public void move(int x, int y) {
System.out.println("move");
}
@Override
public void attack(Unit u) {
System.out.println("attack");
}
}
class Unit {
int currentHP;
int x;
int y;
}
interface Movable { void move(int x, int y); }
interface Attackable { void attack(Unit u); }
interface Fightable extends Movable, Attackable {}
다형성이란?
인터페이스도 엄밀히 말하면 이 인터페이스를 구현한 클래스의 조상이라고 할 수 있다.
해당 인터페이스 타입의 참조변수로 이 인터페이스를 구현한 클래스의 인스턴스를 참조할 수 있다.
인터페이스는 메서드의 매개변수 타입으로 사용될 수 있다.
어제 공부 엄청 많이하셨네요. 알고리즘도 4개나 해결하셨군요..👏