给定一个整数数组
A
,对于每个整数A[i]
,我们可以选择x = -K
或是x = K
,并将x
加到A[i]
中。在此过程之后,我们得到一些数组
B
。返回
B
的最大值和B
的最小值之间可能存在的最小差值。示例 1:
输入:A = [1], K = 0 输出:0 解释:B = [1]
思路1:先将字符串全部置为“aaaa...” 或 "bbbbb..." ,再查找连续的"aaa"或"bbb",并将连续的进行修改。
public String strWithout3a3b(int A, int B)
{
StringBuilder sBuilder = new StringBuilder();
int temp = 0;
char longer = A >= B ? 'a' : 'b'; // 较长的子串
char shorter = A < B ? 'a' : 'b'; // 较短的子串
int shortLen = A < B ? A : B; // 较短子串长度
// 先将子串全部变成较长子串
int total = A + B;
while (total > 0)
{
sBuilder.append(longer);
total--;
}
char[] array = sBuilder.toString().toCharArray();
String subStr = new StringBuilder().append(longer)
.append(longer).append(longer).toString();
int k = array.length-1; // 最后一个字符的位置
int lastIdx = 0;
// 查找连续子串
while (shortLen != 0)
{
int idx = sBuilder.toString().indexOf(subStr, lastIdx);
lastIdx = idx + 3;
// 找到连续的aaa
if (idx != -1)
{
array[idx+2] = shorter;
shortLen--;
}
else
{
// 找到第一个不是shorter的位置
while (array[k] == shorter)
{
k--;
}
array[k] = shorter;
k--;
shortLen--;
}
}
return new String(array);
}
思路2:贪心策略。
public String strWithout3a3b(int A, int B)
{
StringBuilder ans = new StringBuilder();
int L = 0;
boolean writeA = false;
while (A > 0 || B > 0)
{
writeA = false; // 是否写'a'
L = ans.length();
// 先写'a'的条件(贪心策略)
if (L >= 2 && (ans.charAt(L-1) == ans.charAt(L-2))) // 连续两个字符相同
{
if (ans.charAt(L-1) == 'b')// 末尾是'bb'
writeA = true;
}
else
{
if ( A >= B) // 先写较长的字符
writeA = true;
}
// 开始写'a'或写'b'
if (writeA)
{
A--;
ans.append('a');
}
else
{
B--;
ans.append('b');
}
}
return ans.toString();
}