分割十六进制字符串:返回最小分割数,以使每个分割都是一个完美正方形的十六进制表示形式

时间:2020-05-23 05:37:41

标签: string algorithm data-structures

你们将如何处理?我在面试中遇到了这个问题。

示例:896bb1返回1,因为它是9006001的十六进制表示形式,它是3001的正整数。示例:1a919返回3,因为1,a9和19是完美正方形的十六进制表示形式,而3是最小数字需要拆分。

1 个答案:

答案 0 :(得分:1)

这是Ruby中解决此问题的方法。

MAX_NUM = 999999.freeze

def get_min(hex)
  return "Invalid hex" unless validate_hex?(hex)

  pieces = min_breaks(hex)
  return -1 if pieces == MAX_NUM

  pieces
end

def min_breaks(hex, index = 0)
  hex_length = hex.length
  return 0 if index == hex_length

  numeric = 0
  result = MAX_NUM

  for i in index..hex_length-1 do
    numeric = numeric * 16 + hex[i].hex
    result = [result, 1 + min_breaks(hex, i + 1)].min if is_square?(numeric)
  end

  result
end

def is_square?(x)
  (Math.sqrt(x) % 1).zero?
end

def validate_hex?(hex)
  hex =~ /^[0-9a-f]+$/i
end

puts "Enter hex string:"
hex = gets.chomp

puts "Output: #{get_min(hex.downcase)}"