File tree Expand file tree Collapse file tree 3 files changed +113
-0
lines changed
encode-and-decode-strings Expand file tree Collapse file tree 3 files changed +113
-0
lines changed Original file line number Diff line number Diff line change 1+ class SolutionCountingBits {
2+ public int [] countBits (int n ) {
3+ // 0 ~ n 까지의 수를 이진수로 변환한다음, 1의 개수를 카운트해 배열로 반환
4+ // 홀수/짝수 여부를 나눠서 1의 개수를 구함
5+ // 홀수: 이전 값 + 1, 짝수: i / 2의 1의 개수와 같은 값
6+ // 시간복잡도: O(N), 공간복잡도: O(N)
7+
8+ int [] countingBits = new int [n + 1 ];
9+ countingBits [0 ] = 0 ;
10+
11+ for (int i =1 ; i <=n ; i ++) {
12+ if (isOddNumber (i )) {
13+ countingBits [i ] = countingBits [i - 1 ] + 1 ;
14+ } else {
15+ countingBits [i ] = countingBits [i / 2 ];
16+ }
17+ }
18+
19+ return countingBits ;
20+ }
21+
22+ // 시간복잡도: O(1)
23+ private boolean isOddNumber (int n ) {
24+ return n % 2 == 1 ;
25+ }
26+ }
Original file line number Diff line number Diff line change 1+ import java .util .ArrayList ;
2+ import java .util .List ;
3+
4+ class SolutionEncodeAndDecodeStrings {
5+
6+ private static final char SEPERATOR = '/' ;
7+ /*
8+ * @param strs: a list of strings
9+ * @return: encodes a list of strings to a single string.
10+ */
11+ // 풀이: 문자열 길이를 구분자와 함께 encode해 decode시 문자열 길이를 참고할 수 있도록 한다
12+ // 시간복잡도: O(N), 공간복잡도: O(1)
13+ public String encode (List <String > strs ) {
14+ // write your code here
15+ var answer = new StringBuilder ();
16+
17+ for (var str : strs ) {
18+ answer .append (SEPERATOR )
19+ .append (str .length ())
20+ .append (str );
21+ }
22+
23+ return answer .toString ();
24+ }
25+
26+ /*
27+ * @param str: A string
28+ * @return: decodes a single string to a list of strings
29+ */
30+ // 풀이: 문자열 길이를 구분자와 함께 encode해 decode시 문자열 길이를 참고할 수 있도록 한다
31+ // 시간복잡도: O(N), 공간복잡도: O(N)
32+ public List <String > decode (String str ) {
33+ // write your code here
34+ List <String > answer = new ArrayList <>();
35+ var i = 0 ;
36+ while (i < str .length ()) {
37+ var seperatorIdx = str .indexOf (SEPERATOR , i ) + 1 ;
38+ var size = Integer .parseInt (str .substring (seperatorIdx , seperatorIdx + 1 ));
39+ i = seperatorIdx + size + 1 ;
40+ answer .add (str .substring (seperatorIdx + 1 , i ));
41+ }
42+
43+ return answer ;
44+ }
45+ }
Original file line number Diff line number Diff line change 1+ import java .util .HashMap ;
2+ import java .util .Map ;
3+
4+ class SolutionValidAnagram {
5+ public boolean isAnagram (String s , String t ) {
6+ // 풀이: 해시맵을 사용해 s와 t의 문자 별 빈도수를 저장한다
7+ // 두 빈도수의 모든 키와 값이 같고, 크기가 같은지 비교한다.
8+ // 다르다면 false를 반환, 모두 같다면 true를 반환한다.
9+ // 시간복잡도: O(N), 공간복잡도: O(1)
10+
11+ Map <Character , Integer > sAnagram = createAnagramMap (s );
12+ Map <Character , Integer > tAnagram = createAnagramMap (t );
13+
14+ // 두 해시맵의 크기가 같은지 확인
15+ if (sAnagram .size () != tAnagram .size ()) {
16+ return false ;
17+ }
18+
19+ // sAnagram과 tAnagram의 모든 키와 값을 비교
20+ for (Map .Entry <Character , Integer > entry : sAnagram .entrySet ()) {
21+ var key = entry .getKey ();
22+ int value = entry .getValue ();
23+
24+ // tAnagram에 key가 존재하지 않거나, 그에 대응하는 value가 다르면 false 반환
25+ if (!tAnagram .containsKey (key ) || !tAnagram .get (key ).equals (value )) {
26+ return false ;
27+ }
28+ }
29+
30+ return true ;
31+ }
32+
33+ private Map <Character , Integer > createAnagramMap (String text ) {
34+ Map <Character , Integer > anaGramMap = new HashMap <>();
35+
36+ for (var c : text .toCharArray ()) {
37+ anaGramMap .put (c , anaGramMap .getOrDefault (c , 0 ) + 1 );
38+ }
39+
40+ return anaGramMap ;
41+ }
42+ }
You can’t perform that action at this time.
0 commit comments