Algorithm/java tip

Tip2(easy)

개구리는 개꿀개꿀 2020. 4. 13. 15:12

문제 : https://leetcode.com/problems/sort-integers-by-the-number-of-1-bits/

public int[] sortByBits(int[] arr) {
		// 2진수로 1의 갯수로 오름차순 정렬
		// 똑같으면 그냥 오름차순
		Data[] data = new Data[arr.length];
		for(int i=0; i<arr.length; i++) {
			String bn = Integer.toBinaryString(arr[i]);
			data[i] = new Data(arr[i], bn, getOneNum(bn));
		}
		Arrays.sort(data);
		return Arrays.stream(data).map(e -> e.n).mapToInt(e -> e).toArray();
	}

	class Data implements Comparable<Data> {
		public Data(int n, String bn, int cnt) {
			this.n = n;
			this.bn = bn;
			this.cnt = cnt;
		}

		int n;
		String bn;
		int cnt;

		@Override
		public int compareTo(Data o) {
			if(this.cnt == o.cnt) {
				return this.n - o.n;
			}
			return this.cnt - o.cnt;
		}
	}

	private int getOneNum(String bn) {
		int n=0;
		for(char c : bn.toCharArray()) {
			if(c == '1') n++;
		}
		return n;
	}

Comparable을 잘 사용하면 편하다

문제 : https://leetcode.com/problems/the-k-weakest-rows-in-a-matrix/

참고 : https://leetcode.com/problems/the-k-weakest-rows-in-a-matrix/discuss/521929/Beats-100-runtimespace

 

public int[] kWeakestRows(int[][] mat, int k) {
		//row 별 1의 갯수 오름차순, 갯수가 같다면 index 오름차순
		Power[] powers = new Power[mat.length];

		for(int i=0; i<mat.length; i++) {
			int power = 0;
			for(int j=0; j<mat[i].length; j++) {
				if(mat[i][j] == 1) {
					power++;
				} else {
					break;
				}
			}
			powers[i] = new Power(power, i);
		}
		Arrays.sort(powers);
		return Arrays.stream(powers).map(e -> e.index).limit(k).mapToInt(e -> e).toArray();
	}

	class Power implements Comparable<Power> {

		int power;
		int index;

		public Power(int power, int index) {
			this.power = power;
			this.index = index;
		}

		@Override
		public int compareTo(Power o) {
			if(this.power == o.power) {
				return this.index - o.index;
			}
			return this.power - o.power;
		}
	}

 

비슷한 문제

 

문제 : https://leetcode.com/problems/middle-of-the-linked-list/
참고 : https://leetcode.com/problems/middle-of-the-linked-list/discuss/571951/Java-O(n)-solution-fast-and-slow-pointer

	// 1 -> 2 -> 3 -> 4 -> 5
	// 1 -> 2 -> 3 -> 4 -> 5 -> 6
	public ListNode middleNode(ListNode head) {
		int size = 1;
		ListNode next = head;
		while(next.next != null) {
			size++;
			next = next.next;
		}
		int index = 0;
		next = head;
		while(index++ < (size / 2)) {
			next = next.next;
		}
		return next;
	}