Maximum Value of a String in an Array

🏠 ⬅️ ➡️

The value of an alphanumeric string can be defined as:

  • The numeric representation of the string in base 10, if it comprises of digits only.
  • The length of the string, otherwise.

Given an array strs of alphanumeric strings, return the maximum value of any string in strs.

Example 1:

Input: strs = [ "alic3 ", "bob ", "3 ", "4 ", "00000 "] Output: 5 Explanation: - "alic3 " consists of both letters and digits, so its value is its length, i.e. 5. - "bob " consists only of letters, so its value is also its length, i.e. 3. - "3 " consists only of digits, so its value is its numeric equivalent, i.e. 3. - "4 " also consists only of digits, so its value is 4. - "00000 " consists only of digits, so its value is 0. Hence, the maximum value is 5, of "alic3 ".

Example 2:

Input: strs = [ "1 ", "01 ", "001 ", "0001 "] Output: 1 Explanation: Each string in the array has value 1. Hence, we return 1.

Constraints:

  • 1 <= strs.length <= 100
  • 1 <= strs[i].length <= 9
  • strs[i] consists of only lowercase English letters and digits.

Note: This problem is from LeetCode.
Compiled
Executed
Correct
program main
    implicit none

    integer :: i, j, k, n, m
    character(len=:), allocatable :: strs(:)
    integer :: max_val

    ! Example 1
    n = 5
    allocate(strs(n))
    strs(1) = 'alic3 '
    strs(2) = 'bob '
    strs(3) = '3 '
    strs(4) = '4 '
    strs(5) = '00000 '
    write(*,*) 'Example 1:'
    do i = 1, n
        write(*,'(A)') trim(strs(i)) // ': ' // str(i)
    end do
    max_val = max_value(strs)
    write(*,*) 'Maximum value: ', max_val

    ! Example 2
    n = 4
    allocate(strs(n))
    strs(1) = '1 '
    strs(2) = '01 '
    strs(3) = '001 '
    strs(4) = '0001 '
    write(*,*) 'Example 2:'
    do i = 1, n
        write(*,'(A)') trim(strs(i)) // ': ' // str(i)
    end do
    max_val = max_value(strs)
    write(*,*) 'Maximum value: ', max_val

contains

    function str(i) result(res)
        implicit none
        integer, intent(in) :: i
        character(len=:), allocatable :: res
        if (is_digits(strs(i))) then
            res = num_to_str(str_to_num(strs(i)), 10)
        else
            res = strs(i)
        end if
    end function str

    pure function is_digits(str) result(res)
        implicit none
        character(len=*), intent(in) :: str
        logical :: res
        res = .true.
        do i = 1, len(str)
            if (.not. is_digit(str(i:i))) then
                res = .false.
                exit
            end if
        end do
    end function is_digits

    pure function is_digit(c) result(res)
        implicit none
        character, intent(in) :: c
        logical :: res
        res = c >= '0' .and. c <= '9'
    end function is_digit

    pure function str_to_num(str) result(res)
        implicit none
        character(len=*), intent(in) :: str
        integer :: res
        read(str, *) res
    end function str_to_num

    pure function num_to_str(num, base) result(res)
        implicit none
        integer, intent(in) :: num, base
        character(len=:), allocatable :: res
        character(len=:), allocatable :: tmp
        integer :: i
        if (base == 10) then
            res = num_to_str_10(num)
        else
            allocate(character(len=log10(num)+1) :: tmp)
            write(tmp, '(I0)') num
            res = tmp
        end if
    end function num_to_str

    pure function num_to_str_10(num) result(res)
        implicit none
        integer, intent(in) :: num
        character(len=:), allocatable :: res
        character(len=:), allocatable :: tmp
        integer :: i
        allocate(character(len=log10(num)+1) :: tmp)
        write(tmp, '(I0)') num
        res = tmp
    end function num_to_str_10

    pure function max_value(strs) result(res)
        implicit none
        character(len=*), intent(in) :: strs(:)
        integer :: res
        res = -huge(res)
        do i = 1, size(strs)
            if (str(i) > res) then
                res = str(i)
            end if
        end do
    end function max_
Compiled
Executed
Correct
module max_value_of_alphanumeric_strings

implicit none

contains

function max_value(strs) result(max_val)

! Given an array of alphanumeric strings, return the maximum value of any string in the array.
! The value of a string can be defined as:
! - The numeric representation of the string in base 10, if it comprises of digits only.
! - The length of the string, otherwise.

character(len=*), intent(in) :: strs(:)
integer :: max_val
integer :: i, j, num, len

! Initialize the maximum value to the first string in the array.
max_val = len(strs(1))

! Iterate over each string in the array.
do i = 1, size(strs)

    ! Convert the string to a number if possible.
    read(strs(i), *, iostat=j) num

    ! If the string is a number, calculate its value.
    if (j == 0) then
        len = len(strs(i))
        max_val = max(max_val, num * (len - 1))
    ! Otherwise, calculate its value as its length.
    else
        max_val = max(max_val, len(strs(i)))
    end if

end do

end function max_value

end module max_value_of_alphanumeric_strings

program test_max_value

use max_value_of_alphanumeric_strings

implicit none

! Test case 1:
print *, max_value(["alic3 ", "bob ", "3 ", "4 ", "00000 "])

! Test case 2:
print *, max_value(["1 ", "01 ", "001 ", "0001 "])

end program test_max_value
🌐 Data from online sources
def maxValue(strs) -> int:
    max_value = 0
    for str in strs:
        if str.isdigit():
            value = int(str)
        else:
            value = len(str)
        max_value = max(max_value, value)
    return max_value

We iterate through the input array strs. For each string, we check whether it contains only digits or not. If it contains only digits, we find its numeric value and store it in a variable value. If it contains other characters (letters), we store its length in the value variable. In each iteration, we update the max_value variable with the maximum of the current max_value and the value found.

Finally, we return the max_value.

🌐 Data from online sources
#include <string>
#include <vector>

int maxValue(std::vector<std::string>& strs) {
    int max_value = 0;
    for (const std::string& str : strs) {
        int value;
        if (str.find_first_not_of("0123456789") == std::string::npos) {
            value = std::stoi(str);
        } else {
            value = static_cast<int>(str.length());
        }
        max_value = std::max(max_value, value);
    }
    return max_value;
}

We iterate through the input array strs. For each string, we check whether it contains only digits or not. If it contains only digits, we find its numeric value and store it in a variable value. If it contains other characters (letters), we store its length in the value variable. In each iteration, we update the max_value variable with the maximum of the current max_value and the value found.

Finally, we return the max_value.