Максимальное целочисленное значение Java - PullRequest
0 голосов
/ 04 октября 2018

Я пытался решить форму задачи «Максимальное целочисленное значение» Geeksforgeeks .
Задача состоит в следующем: если задана строка S из цифр (0-9), ваша задача - найти максимумзначение, которое можно получить из строки, поместив операторы '*' или '+' между цифрами при обходе слева направо строки и подняв одну цифру за раз.

Input:Первая строка ввода содержит T, обозначающее количество тестовых случаев.Т-тесты следуют.Каждый тестовый набор содержит одну строку ввода, обозначающую строку.

Вывод: для каждого тестового примера выведите полученное максимальное значение.

Это то, что я сделал:

class GFG
 {
    public static void sort(int[] numbers)
    {
        int n = numbers.length; 
        for (int i = 1; i < n; ++i) 
        { 
            int key = numbers[i]; 
            int j = i - 1; 

            while (j >= 0 && numbers[j] > key) 
            { 
                numbers[j + 1] = numbers[j]; 
                j = j -1 ; 
            } 
            numbers[j + 1] = key; 
        }

        System.out.println(numbers.length - 1);
    }
    public static void main (String[] args)
     {
        Scanner sc = new Scanner(System.in);
        int testCases = sc.nextInt();
        int [] maxNum;
        for(int i = 0; i< testCases; i++)
        {
            String numbers = sc.nextLine();
            char[] cNumbers = numbers.toCharArray();
            maxNum = new int [cNumbers.length];
            for(int j = 0; j + 1 < cNumbers.length; j++)
            {
                int sum = 0;
                int mult = 0;
                sum = cNumbers[j] + cNumbers[j + 1];
                mult = cNumbers[j] * cNumbers[j + 1];
                int maxNumber = Math.max(sum, mult);
                maxNum[i] = maxNumber;
            }               
            sort(maxNum);
        }
     }
}

Пример ввода: 2 01230 891 Мой вывод: -1 4 Правильный вывод: 9 73

Что не так с моим кодом?!

Ответы [ 5 ]

0 голосов
/ 17 августа 2019

В соответствии с постановкой задачи нам нужно получить максимальное значение из строки, поместив операторы * или + между цифрами при обходе слева направо строкии поднимая одну цифру за раз.Таким образом, это может быть решено в O (n) без использования какого-либо алгоритма сортировки.Простая логика решения заключается в том, что всякий раз, когда вы обнаружите «0» или «1» в любом из операндов, используйте «+», а в остальных местах - «*».Вот мое решение, которое было успешно отправлено:

import java.util.*;
import java.lang.*;
import java.io.*;
class GFG {
    public static void main (String[] args) {
        Scanner scan = new Scanner(System.in);
        int T = Integer.parseInt(scan.nextLine());
        while(T-- > 0) {
            String str = scan.nextLine();
            maxValue(str);
        }
    }

    static void maxValue(String str) {
        long maxNumber = 0;
        for(int i = 0; i < str.length(); i++) {
            int n = Character.getNumericValue(str.charAt(i));
            if (maxNumber == 0 || maxNumber == 1 ||
                n == 0 || n == 1) {
                maxNumber += n;
            } else {
                maxNumber *= n;
            }
        }
        System.out.println(maxNumber);
    }
}
0 голосов
/ 04 октября 2018

После выполнения

int testCases = sc.nextInt();

буфер содержит символ новой строки.Таким образом, при выполнении строки

String numbers = sc.nextLine();

она считывает '\ n' в числа, так что вы получаете -1 в качестве первого вывода.Также вам необходимо преобразовать символ в целое число, прежде чем использовать любые арифметические операции.

sum = cNumbers[j] + cNumbers[j+1];
mult = cNumbers[j] * cNumbers[j+1];

Так что приведенный выше код даст вам неправильные результаты.

Я попробовал следующий пример и работал.

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String inputAsString = sc.nextLine();
        int testCases = Integer.parseInt(inputAsString);
        int maxNumber = 0;
        for (int i = 0; i < testCases; i++) {
            String numbers = sc.nextLine();
            if(!numbers.matches("\\d+")){
                System.out.println("Only numeric values are expected.");
                continue;
            }
            char[] cNumbers = numbers.toCharArray();
            int sum = 0;
            int mult = 1;
            for (int j = 0; j < cNumbers.length; j++) {
                int nextNumber = Character.getNumericValue(cNumbers[j]);
                sum = sum + nextNumber;
                mult = mult * nextNumber;
                maxNumber = mult > sum ? mult : sum;
                sum = maxNumber;
                mult = maxNumber;
            }

            System.out.println(maxNumber);
        }
        sc.close();
    }
0 голосов
/ 04 октября 2018

Я прочитал ваше описание, и то, что вы делаете, неправильно.Пожалуйста, внимательно прочитайте вопрос, особенно пример на ссылочном сайте.
, как указано в комментариях moilejter, вы используете sc.nextInt(), который не читает '\ n' и создает проблему.следующий sc.nextLine() будет читать только пустую строку, и ваша программа выдает исключение.
Вторая проблема заключается в том, что вы должны вычислять max непрерывно и вам не нужен массив int (вы вычисляете максимальный результат операции между двумя последовательными числами исохраните их в массиве, который не соответствует максимальному целочисленному значению. вы найдете только максимальное значение между каждыми двумя цифрами, но не максимальное число операций для всех цифр).
Третья проблема заключается в том, что вы используете символ в качестве чисел, что приводит к неверному результату.(вы должны преобразовать их в целое число). Итак, для вашего вывода есть код:

public class GFG
{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int testCases = Integer.valueOf(sc.nextLine());
        for (int i = 0; i < testCases; i++)
        {
            String numbers = sc.nextLine();
            char[] cNumbers = numbers.toCharArray();
            long maxUntilNow = cNumbers[0] - '0';
            for (int j = 1; j < cNumbers.length; j++)
            {
                int numberOfThisPlace = cNumbers[j] - '0';
                maxUntilNow = Math.max(maxUntilNow + numberOfThisPlace,
                              maxUntilNow * numberOfThisPlace);
            }
            System.out.println(maxUntilNow);
        }
    }
}   

Надеюсь, это то, что вы хотите.

0 голосов
/ 04 октября 2018

Идея состоит в том, чтобы поставить операторов альтернативно и выбрать максимальные результаты.

import java.util.Scanner;

    public class Demo {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int testCases = Integer.parseInt(sc.nextLine());
            for (int i = 0; i < testCases; i++) {
                String numbers = sc.nextLine();
                int max = 0;
                for (int j = 0; j + 1 < numbers.length(); j++) {
                    int next = Integer.parseInt(numbers.substring(j, j+1));
                    if (max +  next > max * next)
                        max = max + next;
                    else
                        max = max * next;
                }
                System.out.println(max);
            }
            sc.close();
        }
    }
0 голосов
/ 04 октября 2018

Просто быстрый взгляд, если ваша цифра меньше двух, ее следует добавить.2 или больше должны быть умножены.Не на ПК, чтобы проверить, хотя.

...