Encuentra el número ordenado más cercano y más pequeño

Número Tidy son aquellos números cuyos dígitos están ordenados en orden no decreciente. Aquí, se nos da un número y tenemos que encontrar otro número que sea más pequeño pero más cercano al número dado y también ese número debe estar ordenado, es decir, su dígito debe estar en orden no decreciente. 

Ejemplos: 

Input  : 91234
Output : 89999
Tidy property is violated by appearing 1 after 9. 
So, we will reduce 9 by 1 and the number right
to it will be replaced by 9. So, generated tidy
number is 89999.

Input  : 45000
Output : 44999

La idea es atravesar desde el final. Cada vez que se viola la propiedad ordenada, reducimos el dígito en uno y convertimos todos los dígitos posteriores en 9.  

C++

// C++ program to find closest
// tidy number smaller than the
// given number
#include<bits/stdc++.h>
using namespace std;
 
char* tidyNum(char str[], int len)
{
    for (int i = len-2; i >= 0; i--)
    {
        // check whether string violates tidy property
        if (str[i] > str[i+1])
        {
            // if string violates tidy property, then
            // decrease the value stored at that index by 1
            // and replace all the value stored right to
            // that index by 9
            (char)str[i]--;
            for (int j=i+1; j<len; j++)
                str[j] = '9';
        }
    }
    return str;
}
 
// Driver code
int main()
{
    char str[] = "11333445538";
    int len = strlen(str);
     
    // num will store closest tidy number
    char *num = tidyNum(str, len);
    printf("%s\n", num);
    return 0;
}

Java

// Java program to find closest
// tidy number smaller than the
// given number
import java.io.*;
class GFG
{
static String tidyNum(String str1,
                      int len)
{
    char[] str = str1.toCharArray();
    for (int i = len - 2; i >= 0; i--)
    {
        // check whether string
        // violates tidy property
        if (str[i] > str[i + 1])
        {
            // if string violates tidy
            // property, then decrease the
            // value stored at that index
            // by 1 and replace all the value
            // stored right to that index by 9
            str[i]--;
            for (int j = i + 1; j < len; j++)
                str[j] = '9';
        }
    }
    return String.valueOf(str);
}
 
// Driver code
public static void main(String[] args)
{
    String str = "11333445538";
    int len = str.length();
     
    // num will store closest tidy number
    System.out.println(tidyNum(str, len));
}
}
 
// This code is contributed by mits

Python3

# Python 3 program to find closest
# tidy number smaller than the
# given number
 
def tidyNum(str, len):
 
    for i in range(len-2, -1, -1):
     
        # check whether string
        # violates tidy property
        if (str[i] > str[i+1]):
         
            # if string violates tidy
            # property, then decrease the
            # value stored at that index by 1
            # and replace all the value
            # stored right to that index by 9
            str[i] -= 1
            for j in range(i+1, len):
                str[j] = 9
         
    return str
 
# Driver code
str = [1,1,3,3,3,4,4,5,5,3,8]
len = len(str)
     
# num will store closest tidy number
num = tidyNum(str, len)
 
for i in range(0,len):
    print(str[i], end = "")
 
# This code is contributed by
# Smitha Dinesh Semwal

C#

// C# program to find closest
// tidy number smaller than the
// given number
using System;
 
class GFG
{
static String tidyNum(String str1, int len)
{
    char[] str = str1.ToCharArray();
    for (int i = len - 2; i >= 0; i--)
    {
        // check whether string
        // violates tidy property
        if (str[i] > str[i + 1])
        {
            // if string violates tidy
            // property, then decrease the
            // value stored at that index
            // by 1 and replace all the value
            // stored right to that index by 9
            str[i]--;
            for (int j = i + 1; j < len; j++)
                str[j] = '9';
        }
    }
    string s = new string(str);
    return s;
}
 
// Driver code
static void Main()
{
    String str = "11333445538";
    int len = str.Length;
     
    // num will store closest tidy number
    Console.WriteLine(tidyNum(str, len));
}
}
 
// This code is contributed by mits

PHP

<?php
// PHP program to find closest
// tidy number smaller than the
// given number
 
function tidyNum($str, $len)
{
    for ($i = $len - 2; $i >= 0; $i--)
    {
        // check whether string
        // violates tidy property
        if ($str[$i] > $str[$i + 1])
        {
            // if string violates tidy
            // property, then decrease
            // the value stored at that
            // index by 1 and replace all
            // the value stored right to
            // that index by 9
            $x = ord($str[$i]);
            $x--;
            $str[$i] = chr($x);
            for ($j = $i + 1; $j < $len; $j++)
                $str[$j] = '9';
        }
    }
    return $str;
}
 
// Driver code
$str = "11333445538";
$len = strlen($str);
 
// num will store
// closest tidy number
$num = tidyNum($str, $len);
echo $num;
 
// This code is contributed by mits
?>

Javascript

<script>
 
// Javascript program to find closest
// tidy number smaller than the
// given number
function tidyNum(str1, len)
{
    var str = str1.split('');
    for (i = len - 2; i >= 0; i--)
    {
         
        // Check whether string
        // violates tidy property
        if (str[i] > str[i + 1])
        {
             
            // If string violates tidy
            // property, then decrease the
            // value stored at that index
            // by 1 and replace all the value
            // stored right to that index by 9
            str[i]--;
             
            for(j = i + 1; j < len; j++)
                str[j] = '9';
        }
    }
    return str.join("");
}
 
// Driver code
var str = "11333445538";
var len = str.length;
 
// num will store closest tidy number
document.write(tidyNum(str, len));
 
// This code is contributed by Amit Katiyar
 
</script>

Producción: 

11333444999

Referencias:
esta pregunta se hace en la ronda de clasificación de Google Code Jam 2017.

Este artículo es una contribución de Aditya kumar . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a contribuido@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *