如何获取只删除一位数字得到的最大可能值

How to get the maximum possible value obtained by deleting only one digit

我遇到了这个可容性测试,其中我需要 return 通过从数字中删除一个“5”数字获得的最大可能值,例如:

我设法通过创建一个置换数组来做到这一点,但它是 O(NlogN) 可以让它变得更好吗?

  • 将最大值设置为 Integer.MIN_VALUE

  • 转换为字符串

  • 迭代字符串中的所有位置

  • 删除字符

  • 将结果字符串转换为整数

  • 如果找到新的最大值,请设置最大值

  • Return遍历所有值后的最大值!

    public static void main(String []args){
      int value = 15958;
    
      int maxValue = Integer.MIN_VALUE;
      String stringValue = Integer.toString(value);
      for (int i = 0; i < stringValue.length(); i++) {
          String stringToCheck = stringValue.substring(0, i) + stringValue.substring(i + 1);
          int intToCheck = Integer.parseInt(stringToCheck);
          maxValue = intToCheck > maxValue ? intToCheck : maxValue;
      }
      System.out.println(maxValue);
    }
    

以下 MWB 回答此处理负数并仅删除一位数字:

public static void main(String []args){
    int num = -1595;
    int sign = num > 0 ? 1 : -1;
    int value = Math.abs(num);
    int maxValue = Integer.MIN_VALUE;
    String stringValue = Integer.toString(value);

    for (int i = 0; i < stringValue.length(); i++) {

      final String digit = stringValue.substring(i, i + 1);

      if (digit.equals("5")) {
        String stringToCheck = stringValue.substring(0, i) + stringValue.substring(i + 1);
        int intToCheck = Integer.parseInt(stringToCheck) * sign;
        maxValue = Math.max(intToCheck, maxValue);
      }

    }
    System.out.println(maxValue);
}

是的,正确,该函数也可以完美地处理负数和正数 -

public static int getMaxValue(){ 整数值 = -15958;

        int maxValue = Integer.MIN_VALUE;
        String stringValue = Integer.toString(value);
        for (int i = 0; i < stringValue.length(); i++) {
            if(stringValue.charAt(i)=='5') {
                String stringToCheck = stringValue.substring(0, i) + stringValue.substring(i + 1);
                int intToCheck = Integer.parseInt(stringToCheck);
                maxValue = intToCheck > maxValue ? intToCheck : maxValue;
            }
        }
        //System.out.println(maxValue);
    return maxValue;
}

如果我们考虑 Java 7 及以上,以上所有答案的时间复杂度均为 O(n^2)。 原因:1.You 遍历整个字符串 2.在每次迭代中,您都在创建一个 O(n) 操作的子字符串 本身

解决方案:

int size = String.valueOf(n).length();
if(n<0) {
    size--;
}
int max = Integer.MIN_VALUE;
int divisor = Math.pow(10, size-1);
int left = 0;
int right=0;
while(divisor > 0) {
    left = n/divisor;//left part includes the current 5
    right = n%divisor;
    if(temp%5 == 0 && temp%10 != 0) {
        temp=temp/10;//remove the current 5;
        newNum = temp*divisor+remainder
        max=Math.max(newNum, max);
    }
    divisor = divisor/10;
}
return max;

int RemoveOneFive(int N)
{
    bool negative = (N>0) ? false:true;
 
    std::string s = std::to_string(N);
    int numFives = 0;
    for(int i=0;i<s.length(); i++)
        numFives = (s[i] == '5') ? numFives + 1 : numFives;
 
    int process = false;
    std::string out;
    for(int i=0;i<s.length(); i++)
    {
        if(s[i] != '5' || process == true)
            out.push_back(s[i]);
 
        else if(s[i] == '5')
        {
            if(numFives == 1)
                continue;
            else
            {
                numFives --;

                if((s[i+1] > '5' && negative == false) || (s[i+1] < '5' && negative == true)
                    process = true;
                else
                    out = out + s[i];
            }
        }
 
    }
 
    return std::atoi(&out[0]);
}

 public static int MaxAfterRemoving5(int num){
        string numStr = num.ToString();
        List<int> possibilities = new List<int>();
        for (int i = 0; i < numStr.Length;i++){
            if(numStr[i]=='5'){
                string splitStr = numStr.Remove(i, 1);
                possibilities.Add(Convert.ToInt32(splitStr));
            }
        }
        return possibilities.Max();
    }