Есть ли способ сортировки цифр целого числа без какого-либо массива в JAVA? - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь отсортировать цифры целого числа в порядке убывания в JAVA, но мне не разрешено использовать какой-либо массив.

Это было дано мне как задание в классе, и ниже приведен код, который я пробовал, но не смог.

import java.util.Scanner;
class descend
{
    public static void main(String args[])
    {
        int a=0,loc=0,parse=0,temp=0,big=0;
        Scanner scan = new Scanner(System.in);
        System.out.print("Enter a number");
        a=scan.nextInt();
        String s=Integer.toString(a);
        int l=s.length();
        for(int i=0;i<l;i++)
        {
            big=(int)(s.charAt(i));
            loc=i;
            for(int j=i+1;j<l;j++)
            {
                parse=(int)(s.charAt(j));
                if(parse>big)
                {
                    big = parse;
                    loc=j;
                }
            }
            temp=parse;
            s.charAt(i)=s.charAt(loc);
            s.charAt(loc)=temp
        }
        System.out.print(s);
    }
}

Здесь я получаю синтаксическую ошибку при s.charAt(i)=s.charAt(loc); и s.charAt(loc)=temp;, что требуется переменная, но задано значение.

Пожалуйста, помогите мне с этим, и я всегда буду вам благодарен.

Ответы [ 4 ]

0 голосов
/ 16 апреля 2019

Извините, но, приложив столько усилий, я понял это.

int n=54321;char ch;
String s=Integer.toString(n);
int l= s.length();
for(int i=48;i<=57;i++)    //ascii values from 0 - 9
{
    for(int j=0;j<l;j++)
    {
      ch=s.charAt(j);
      if(ch==(char)i)    // checking if a digit equals a number
      {
        System.out.print(ch);
      }
    }
}

Сортирует цифры в порядке возрастания. Для сортировки по убыванию мы должны использовать

for(int i=57;i>=48;i--)

0 голосов
/ 10 апреля 2019

Строка не может быть изменена, только заменена, следовательно, a = b; f(b); никогда не изменит a.

Имея только 10 цифр, вы можете перебирать, шагать от 0 до 9 для сортировки:

int number = ... // or String number
if (number == 0) { // or < 10
    System.out.println(number);
} else {
    for (int digit = 0; digit <= 9; ++digit) {
        // While being able to remove the current digit:
        for (;;) {
            int scrapedNumber = numberWithoutDigitOnce(number, digit);
            if (scrapedNumber == number) {
                break;
            }
            number = scrapedNumber;
            System.out.print(digit);
        }
    }
    System.out.println();
}

int numberWithoutDigitOnce(int number, int digit) {
    if (number % 10 == digit) {
        return number / 10;
    }
    int n = numberWithoutDigitOnce(number/10, digit)*10 + (number % 10);
}

Ноль - это особый случай.

0 голосов
/ 10 апреля 2019

Может быть, учитель захочет проверить ваши знания о новом потоковом API. Или, может быть, он хочет, чтобы вы проверили свои знания о Collections.sort () и LinkedList (который не содержит внутреннего массива).

1.) Вот решение с потоковым API:

int number = 52214;
String.valueOf(number).chars()
   .sorted()
   .map(Character::getNumericValue).forEach(System.out::print);

Это распечатает:

12245

2.) Вот решение с коллекциями:

List<Integer> list = new LinkedList<Integer>();
StringCharacterIterator iterator = new StringCharacterIterator(String.valueOf(number));
for (char c = iterator.first(); c != CharacterIterator.DONE; c = iterator.next()) 
{
    list.add(Character.getNumericValue(c));
}
Collections.sort(list);
System.out.println("list=" + list);

Это распечатает:

list=[1, 2, 2, 4, 5]
0 голосов
/ 10 апреля 2019

Рекурсивное решение: вы находите старшую цифру в строке, добавляете ее к выходной строке и удаляете ее из входной строки. Повторяйте, пока введенная строка не станет пустой.

Удаление символа с заданным индексом в строке может быть достигнуто путем объединения символов перед индексом и после индекса. (Или с StringBuilder, но я согласен с комментариями к OP, что было бы обманом использовать StringBuilder)

private static String sort(String digitsLeftToSort, String sortedString) {
    if(digitsLeftToSort.length() == 0) { // no more character to sort
        return sortedString;
    } else {
        // find the index of the highest digit
        int index = findIndexOfHighestDigit(digitsLeftToSort);
        // add the character at that index to your output String
        sortedString += digitsLeftToSort.charAt(index);
        // Remove it from your input String
        digitsLeftToSort = digitsLeftToSort.substring(0, index) + digitsLeftToSort.substring(index+1);
        // Recursive call with your new Strings
        return sort(digitsLeftToSort, sortedString);
    }
}

// This finds the index of the highest digit in the given String
private static int findIndexOfHighestDigit(String s) {
    int highestDigitValue = -1;
    int highestDigitIndex = -1;
    int integerValue;
    for(int i = 0; i< s.length(); i++) {
        integerValue = Character.getNumericValue(s.charAt(i));
        if(integerValue > highestDigitValue) {
            highestDigitValue = integerValue;
            highestDigitIndex = i;
        }
    }

    return highestDigitIndex;
}

Тогда

String sortedString = sort("462375623478142", "");
System.out.println(sortedString);

Выходы

877665444332221
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...