最大整数值java

时间:2018-10-04 03:55:34

标签: java insertion-sort

我正在尝试解决Geeksforgeeks表格中的最大整数值问题。
问题指出以下内容: 给定一个由数字(0-9)组成的字符串S,您的任务是通过在数字之间从左到右遍历数字时将'*'或'+'运算符放在数字之间来找到可以从字符串中获得的最大值。字符串并一次捡起一个数字。

输入: 输入的第一行包含T,表示测试用例的数量。随后是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 :(得分:1)

请快速浏览一下,如果您的数字少于两位,应该将其相加。 2或更大应该相乘。不在PC上进行测试。

答案 1 :(得分:0)

我阅读了您的描述,但您做错了。请在参考站点中仔细仔细阅读问题示例。
如moilejter的评论中所述,您使用的sc.nextInt()不会读为'\ n'并造成问题。下一个sc.nextLine()将仅读取一个空字符串,并且您的程序将引发异常。
第二个问题是您必须连续计算max,并且不需要int数组(您可以计算两个连续数字之间的max运算结果,并将它们保存在与最大整数值不对应的数组中。您只能在每个数字之间找到max两位数,但不是所有位数的最大值)。
第三个问题是将字符用作数字会导致错误的结果。 (您必须将它们转换为整数) 因此,有一个适用于您的输出的代码:

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);
        }
    }
}   

我希望这就是你想要的。

答案 2 :(得分:0)

这个想法是让运算符交替出现,并选择最大的结果。

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();
        }
    }

答案 3 :(得分:0)

执行

之后
int testCases = sc.nextInt();

缓冲区包含换行符。所以当执行该行

String numbers = sc.nextLine();

它将'\ n'读为数字,因此您将-1作为第一个输出。 另外,在使用任何算术运算之前,还需要将字符转换为Integer。

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();
    }

答案 4 :(得分:0)

根据问题陈述,我们需要通过在字符串之间从左向右遍历数字时将 * + 运算符放在数字之间来从字符串中获取最大值。字符串,一次取一个数字。 因此,可以在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);
    }
}