我有一组数字1-9。 我有一组可变的数字(例如 1-3、1-4 或 1-7 等(。 我需要将第二组数字(变量(居中到第一组。如果第二组数字是偶数,则将第二组数字移近 1。
例:
123456789
000123000
在上面的示例中,4 与 1 相关,5 与 2 相关,6 与 3 相关。
或
123456789
001234000
或
123456789
012345670
我很难分解问题,以便我可以将第二行文本居中离开第一行。"0"并不重要,添加到示例中以显示空间差异。我认为这是基本的数学,但我错过了一些东西。感谢您的帮助!
编辑#1:
package com.company;
public class Main {
private static final int maxNumberOfItems = 9;
public static void main(String[] args) {
int numberOfItems = 6; // Any number between 1 and 9.
int difference = maxNumberOfItems - numberOfItems;
int dividedDifference;
boolean isEven = (numberOfItems % 2) == 0;
if (isEven) {
dividedDifference = (difference - 1) / 2;
} else {
dividedDifference = difference / 2;
}
printAnswer(numberOfItems, dividedDifference, isEven);
}
private static void printAnswer(int numberOfItems, int dividedDifference, boolean isEven) {
//TODO: Print answer here to console.
// Desired output:
// 123456789 (represents maxNumberOfItems)
// --1234--- (represents numberOfItems)
// Pseudo logic.
// Figure out if the var numberOfItems is odd or even.
// If its odd, subtract the numberOfItems from the maxNumberOfItems.
// Take that number and divide by two. That gives the amount of spaces to skip on each side.
// If the number is even, subtract one and divide by two. Get the number of spaces on each side
// and add one back to the right side.
}
}
编辑#2:
@Mbo要求我详细说明和解释"真正的问题"。所以在这里。 在3D世界中,我有一组基座,它们将根据要显示的物品数量生成四分之一圆。基座位置位于固定的 XYZ 坐标处。这些坐标永远不会改变。位置如下图所示。最多只能有 9 个基座。我们想要显示的基座基于我们想要显示的"项目"(我们不断变化的变量(的数量。理想情况下,我们总是想在中间展示它们。如果数字是偶数,那么我们希望显示中间的基座,但更接近 1 而不是 9。编号可以显示在问题顶部的块引号中。
123456789
001234000
示例图像: 四分之一圆和基座位置的表示。
理想的情况是拥有一个包含关键项目编号和值基座位置的地图或哈希图。只要显示一个基座,则始终使用位置 5。
所以给定一张地图,它可能看起来像这样。
示例 1:
4 项。 9 个可能的基座。
项目 1(键(到基座 3 位置(值(。
项目 2(键(到基座 4 位置(值(。
项目 3(键(到基座 5 位置(值(。
项目 4(键(到基座 6 位置(值(。
请注意,上面的示例 4 不会均匀地分成 9,因此居中偏移并靠近 1。
示例 2:
3 项。 9 个可能的基座。
项目 1(键(到基座 4 位置(值(。
项目 2(键(到基座 5 位置(值(。
项目 3(键(到基座 6 位置(值(。
在这个例子中,3 很好地分为 9,因此它可以完美居中。
这才是真正的问题。
您可以简化代码以确定dividedDifference
的值。
dividedDifference
表示第二行中数字右侧的空格数。无论numberOfItems
是偶数还是奇数,都是如此,因此isEven
在您的printAnswer
方法中不是必需的。
在调用printAnswer
之前,您已经执行了大部分必要的逻辑,因此该方法中的大多数伪代码都是多余的。
您可以像这样将输出打印到控制台(isEven
参数已被删除,因此您还需要在调用该方法的位置删除该参数(:
private static void printAnswer(int numberOfItems, int dividedDifference) {
for(int i = 1; i <= maxNumberOfItems; i++)
{
System.out.print(i);
}
System.out.println();
System.out.print(StringUtils.repeat(" ", dividedDifference));
for(int i = 1; i <= numberOfItems; i++)
{
System.out.print(i);
}
System.out.print(StringUtils.repeat(" ", maxNumberOfItems - numberOfItems - dividedDifference));
}
包含StringUtils
的存储库可以在这里找到。
看来你已经完成了工作,不清楚 - 怎么了?
diff = maxNumberOfItems - numberOfItems;
//integer division gives desired result both for even and for odd diff
shift = (maxNumberOfItems - numberOfItems) / 2;
//mapping
location = key + shift;
Number of items shift mapping
9 0 (1->1, 9->9)
8 0 (1->1, 8->8)
7 1 (1->2, 7->8)
6 1 (1->2, 6->7)
5 2 (1->3, 5->7)
4 2 (1->3, 4->6)
3 3 (1->4, 3->6)
2 3 (1->4, 2->5)
1 4 (1->5)
请注意,您可以在数组移位中对这些值进行硬编码[]
实现算法的方法之一是:
public class Main {
private static final int maxNumberOfItems = 9;
public static void main(String[] args) {
int numberOfItems = 1531; // Any number between 1 and 9.
int strLength = Integer.toString(numberOfItems).length(); // the length of the string presentation
printAnswer(numberOfItems, strLength, maxNumberOfItems);
}
private static void printAnswer(int number, int start, int max) {
String str = Integer.toString(number);
for (int i = start; i < max; i++) {
if (i % 2 == 0) { // in this conditions we define from
str += "0"; // which side we need to append "0"
} else {
str = "0" + str;
}
}
System.out.println(str);
}
}
此实现的主要思想是从两侧将所需的数量"0"附加到字符串中,以便将现有的数字解释。
输出:
001531000