Tuesday, January 23, 2018

[2018-Interview] Reverse String

Original question: https://leetcode.com/problems/reverse-string/description/

My answer:



class Solution {
    public String reverseString(String s) {
        if (s == null || s.length() <= 1) {
            return s;
        }
        // solution 1: use stack
        // LinkedList<Character> stack = new LinkedList<Character>();
        // StringBuilder sb = new StringBuilder();
        // for (int i = 0; i < s.length(); i++) {
        //     stack.addLast(s.charAt(i));
        // }
        // while(!stack.isEmpty()) {
        //     sb.append(stack.pollLast());
        // }
        // return sb.toString();

        // solution 2: in-place, one time traverse -> swap
        char[] letters = s.toCharArray();
        char temp = '0';
        int distance = 0;
        do {
            temp = letters[distance];
            letters[distance] = letters[s.length() - 1 - distance];
            letters[s.length() - 1 - distance] = temp;
            distance ++;
        } while(2 * (distance + 1) <= s.length());
        return String.valueOf(letters);
    }
}

One interesting solution: Explanation is here: http://www.cnblogs.com/suoloveyou/archive/2012/04/25/2470292.html

Basically it is using XOR bitwise operation


public static String reverseString5(String s) {
        char[] ch = s.toCharArray();
        int start = 0;
        int end = ch.length - 1;
        while (start < end) {
            ch[start] = (char) (ch[start] ^ ch[end]);
            ch[end] = (char) (ch[start] ^ ch[end]);
            ch[start] = (char) (ch[start] ^ ch[end]);
            start++;
            end--;
        }
        return new String(ch);
    }

Another one is using recursive way to always reverse 1st half and 2nd falf

No comments:

Post a Comment