Coding questions · Capital One
Reorder a String by Alternating Its Front and Back Characters
Rearrange a string by taking characters alternately from its front and its back: first, last, second, second-to-last and so on until every character is used once. Tests clean index handling for even and odd lengths and building the result efficiently for long inputs.
Given a string s, build a new string by taking characters alternately from the front and the back of s: the first character, then the last character, then the second character, then the second-to-last character, and so on, until every character of s has been used exactly once.
Function Signature
def reorder_front_back(s: str) -> str:
Rules
- Let
n = len(s). The output iss[0],s[n-1],s[1],s[n-2],s[2],s[n-3], and so on, stopping as soon asncharacters have been written. - Every position of
sis used exactly once, so the output also has lengthn. Whennis odd, the middle characters[n // 2]is the last one written. - Characters are copied unchanged.
Constraints
1 <= len(s) <= 10^5sconsists of lowercase English letters.
Examples
Example 1
Input: s = "abcdef"
Output: "afbecd"
The characters are taken in the order a (first), f (last), b (second), e (second-to-last), c, d.
Example 2
Input: s = "hello"
Output: "hoell"
The order is h (first), o (last), e (second), l (second-to-last), and finally the middle l.
Example 3
Input: s = "x"
Output: "x"
Alternate Front and Back Characters of a String
Hints
- For a small string such as "hello", write down which index of s supplies each output character; the rules fix that index sequence completely.
- Think about how many positions remain unused at each end after every step. What should happen when exactly one unused position is left?
- The output has exactly len(s) characters, so check that no position is written twice or skipped, especially when the length is odd.
Approach
Use two indices: i starts at the front (0) and j at the back (n - 1). While i <= j, write s[i]; if i != j, also write s[j]; then advance i and retreat j. Invariant: after k iterations the output holds exactly s[0], s[n-1], s[1], s[n-2], ..., s[k-1], s[n-k] in the required order, and the unused positions are exactly i..j. Each iteration therefore appends the next characters of the order the rules define. For even n the indices cross after n/2 iterations with no overlap; for odd n the final iteration has i == j, so the middle character s[n // 2] is written once and last. Every position is written exactly once, so the result has length n. Edge cases: n = 1 returns s itself; strings of identical letters and palindromes still consume positions one at a time, so their length is preserved. Collecting characters in a list or builder and joining once keeps the pass linear instead of quadratic string concatenation.
- Time complexity: O(n)
- Space complexity: O(n)