我被问到了一个问题,现在我因为无法得出准确/正确的结果而自责。
假设我们有一个函数,可以将字符串拆分为多行,但在我们“拆分”到新行之前,每行必须有 x 个字符:
private string[] GetPagedMessages(string input, int maxCharsPerLine) { ... }
对于每一行,我们需要在行的末尾添加“x/y”,它基本上是 1/4、2/4 等... 现在,分页机制也必须是每行长度限制的一部分。
我一直过度劳累、过度思考、在事情上绊倒,这看起来很简单,但对于我的生活来说,我无法弄清楚!我没有“得到”什么?
我对什么感兴趣?计算和部分逻辑,但主要是计算根据每行的最大字符数分割输入需要多少行,还需要包括 x/y。
请记住:x/y 可以有多个数字(即:不仅是 1/4,还可以是 10/17 或 99/200)
示例:
input =“这是一条很长的消息”
每行最大字符数 = 10
输出:
This i 1/4 // << Max 10 chars
s a lo 2/4 // << Max 10 chars
ng mes 3/4 // << Max 10 chars
sage 4/4 // << Max 10 chars
总的来说,逻辑很简单,但只是计算让我失望。
最佳答案
思路:首先求行数是多少位:
(n = input.Length, maxCharsPerLine = 10)
if n <= 9*(10-4) ==> 1 digit
if n <= 9*(10-5) + 90*(10-6) ==> 2 digits
if n <= 9*(10-6) + 90*(10-7) + 900*(10-8) ==> 3 digits
if n <= 9*(10-7) + 90*(10-8) + 900*(10-9) + 9000*(10-10) ==> No solution
然后,减去多余的行数。解决办法:
private static int GetNumberOfLines(string input, int maxCharsPerLine)
{
int n = input.Length;
int x = maxCharsPerLine;
for (int i = 4; i < x; i++)
{
int j, sum = 0, d = 9, numberOfLines = 0;
for (j = i; j <= i + i - 4; j++)
{
if (x - j <= 0)
return -1; // No solution
sum += d * (x - j);
numberOfLines += d;
d *= 10;
}
if (n <= sum)
return numberOfLines - (sum - n) / (x - j + 1);
}
return -2; // Invalid
}
用法:
private static string[] GetPagedMessages(string input, int maxCharsPerLine)
{
int numberOfLines = GetNumberOfLines(input, maxCharsPerLine);
if (numberOfLines < 0)
return null;
string[] result = new string[numberOfLines];
int spaceLeftForLine = maxCharsPerLine - numberOfLines.ToString().Length - 2; // Remove the chars of " x/y" except the incremental 'x'
int inputPosition = 0;
for (int line = 1; line < numberOfLines; line++)
{
int charsInLine = spaceLeftForLine - line.ToString().Length;
result[line - 1] = input.Substring(inputPosition, charsInLine) + $" {line}/{numberOfLines}";
inputPosition += charsInLine;
}
result[numberOfLines-1] = input.Substring(inputPosition) + $" {numberOfLines}/{numberOfLines}";
return result;
}
关于c# - 使用 Page X/Y 计算每行字符串的正确长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65934651/