我正在尝试解决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
我的代码有什么问题?!
答案 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);
}
}