Compare version numbers

작성자

카테고리:

← 피드로
DEV Community · Jaspreet singh · 2026-07-03 개발(SW)

Jaspreet singh

Problem Statement

Given two version strings:

version1

version2

Enter fullscreen mode Exit fullscreen mode

Each version consists of revisions separated by dots (.).

Compare the two versions.

Return:

1  → version1 > version2

-1 → version1 < version2

0  → Both are equal

Enter fullscreen mode Exit fullscreen mode

Leading zeros should be ignored.

Brute Force Intuition

In an interview, you can explain it like this:

Split both version strings using ".", convert each revision to an integer, and compare corresponding revisions one by one.

If one version has fewer revisions, treat the missing revisions as 0.

Complexity

  • Time Complexity: O(N + M)
  • Space Complexity: O(N + M)

Brute Force Code

class Solution {

    public int compareVersion(String version1,
                              String version2) {

        String[] v1 = version1.split("\\.");
        String[] v2 = version2.split("\\.");

        int n = Math.max(v1.length, v2.length);

        for (int i = 0; i < n; i++) {

            int num1 = i < v1.length
                    ? Integer.parseInt(v1[i])
                    : 0;

            int num2 = i < v2.length
                    ? Integer.parseInt(v2[i])
                    : 0;

            if (num1 > num2)
                return 1;

            if (num1 < num2)
                return -1;
        }

        return 0;
    }
}

Enter fullscreen mode Exit fullscreen mode

Moving Towards the Optimal Approach

Instead of creating arrays using split(),

we can process both strings directly.

Traverse both strings simultaneously,

extract one revision at a time,

and compare immediately.

This avoids creating extra arrays.

Pattern Recognition

Whenever you see:

  • Dot Separated Values
  • Version Strings
  • Sequential Comparison

Think:

Two Pointers + String Parsing

Key Observation

Every revision is simply a number.

Read characters until:

'.'

or

End of String

Enter fullscreen mode Exit fullscreen mode

Convert that revision into an integer.

Compare corresponding revisions.

Optimal Approach

Maintain two pointers:

i → version1

j → version2

Enter fullscreen mode Exit fullscreen mode

Extract one revision from both strings.

Compare:

num1

vs

num2

Enter fullscreen mode Exit fullscreen mode

If equal,

move to the next revision.

Optimal Java Solution

class Solution {

    public int compareVersion(String version1,
                              String version2) {

        int i = 0;
        int j = 0;

        while (i < version1.length() ||
               j < version2.length()) {

            int num1 = 0;

            while (i < version1.length() &&
                   version1.charAt(i) != '.') {

                num1 = num1 * 10
                     + (version1.charAt(i) - '0');

                i++;
            }

            int num2 = 0;

            while (j < version2.length() &&
                   version2.charAt(j) != '.') {

                num2 = num2 * 10
                     + (version2.charAt(j) - '0');

                j++;
            }

            if (num1 > num2)
                return 1;

            if (num1 < num2)
                return -1;

            i++;
            j++;
        }

        return 0;
    }
}

Enter fullscreen mode Exit fullscreen mode

Dry Run

Input

version1 = "1.01"

version2 = "1.001"

Enter fullscreen mode Exit fullscreen mode

Compare:

1

=

1

Enter fullscreen mode Exit fullscreen mode

Next Revision:

01

=

001

↓

1

=

1

Enter fullscreen mode Exit fullscreen mode

Answer:

0

Enter fullscreen mode Exit fullscreen mode

Example 2

version1 = "1.0"

version2 = "1.0.1"

Enter fullscreen mode Exit fullscreen mode

Compare:

1 = 1

0 = 0

0 < 1

Enter fullscreen mode Exit fullscreen mode

Answer:

-1

Enter fullscreen mode Exit fullscreen mode

Why This Works?

Each revision is processed exactly once.

Instead of storing all revisions,

we compare them as soon as they are parsed.

Missing revisions are naturally treated as:

0

Enter fullscreen mode Exit fullscreen mode

because the extracted value remains zero when one version ends.

Complexity Analysis

Metric Complexity Time Complexity O(N + M) Space Complexity O(1)

Where:

  • N = version1.length()
  • M = version2.length()

Interview One-Liner

Traverse both version strings simultaneously, parse one revision at a time using two pointers, and compare corresponding revision numbers without splitting the strings.

Pattern Learned

Delimited String

↓

Parse Number

↓

Compare

↓

Move Forward

Enter fullscreen mode Exit fullscreen mode

Similar Problems

  • Compare Version Numbers
  • String to Integer (ATOI)
  • Roman to Integer
  • Basic Calculator
  • Valid Number

Memory Trick

Think:

Read Revision

↓

Convert to Number

↓

Compare

↓

Next Revision

Enter fullscreen mode Exit fullscreen mode

Mental Model

1.0.23

↓

1

↓

0

↓

23

↓

Compare One by One

Enter fullscreen mode Exit fullscreen mode

Whenever you hear:

“Compare version strings”

your brain should immediately think:

Two Pointers + Parse Each Revision

원문에서 계속 ↗

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다