【发布时间】:2022-01-16 01:25:16
【问题描述】:
这是亚马逊在 Hacker Rank 上提出的代码问题。请帮忙解决。
代码问题 在亚马逊的年度销售中,员工的任务是为忠实客户生成有效的折扣券。但是,组合中有一些已使用/无效的优惠券,此任务的挑战是确定给定的折扣优惠券是否有效。
折扣券的有效期确定如下:
- 空的折扣券有效。
- 如果优惠券 A 有效,则优惠券 C 是通过在 A 的开头都添加一个字符 x 制成的 而且A的结尾也是有效的(即优惠券C=xAx有效)。
- 如果两张优惠券A和Bare有效,那么B和A的串联也是有效的 (即优惠券 AB 和 BA 均有效)。
给定n张优惠券,每张优惠券只包含小写英文字符, 其中第 i 个折扣券表示为 discounts[i],判断每张折扣券是否有效。 在 answer 数组中有效的优惠券用 1 表示,无效的优惠券用 0 表示。
示例 折扣 = ['tabba'; 'abca']
检查此优惠券代码是否可以在有效优惠券的规则内构造。 检查“阿巴”: • 根据第一条规则,空字符串有效。 • 根据第二条规则,可以在有效优惠券代码的开头和结尾添加相同的字符。 在空字符串的开头和结尾添加“b”以获得有效代码“bb”。 • 使用相同的规则,将“a”添加到“bb”优惠券字符串的开头和结尾。同样,字符串是有效的。
字符串有效,所以答案数组为1。
检查“abca”: • 使用规则 2,可以在字符串的两端添加一个字母,而不会改变其有效性。 添加到“bc”开头和结尾的“a”不会改变其有效性。 • 剩余的字符串“Ix”无效。没有规则允许在字符串的末尾添加不同的字符。
由于字符串无效,将 0 附加到答案数组。没有要测试的字符串,所以返回 [1,0]
功能说明
在下面的编辑器中完成find ValidDiscountCoupons函数。
find ValidDiscountCoupons 有以下参数: string discounts[n]:要验证的折扣券
返回 int[n]:如果优惠券折扣[il有效,则每个元素i为1,否则为0
我的解决方案(仅部分正确):
public static List<int> findValidDiscountCoupons(List<string> discounts)
{
var r = new List<int>(); // result
foreach (var s in discounts)
{
if (s == "")
r.Add(1);
else if (s.Length == 1)
r.Add(0);
else
{
if (isAllCharCountEven(s) && areCharPairsValid(s))
r.Add(1);
else
r.Add(0);
}
}
return r;
}
public static bool areCharPairsValid(string s)
{
char[] a = s.ToCharArray();
int y = a.Length;
for (int x = 0; x < y; x++)
{
if (x + 1 < y && a[x] == a[x + 1])
{
// two valid characteres together
x++;
}
else if (a[x] == a[y - 1])
{
// chars at the front and the end of array match
y--;
}
else
{
return false;
}
}
return true;
}
public static bool isAllCharCountEven(string s)
{
while (s.Length > 0)
{
int count = 0;
for (int j = 0; j < s.Length; j++)
{
if (s[0] == s[j])
{
count++;
}
}
if (count % 2 != 0)
return false;
s = s.Replace(s[0].ToString(), string.Empty);
}
return true;
}
【问题讨论】:
-
d.length == 1应该是无效字符串。 -
每个字符的数量必须为偶数,但还不够。例如,
acac无效。 -
我同意 cmets by user3386109 。代码已得到增强以匹配这些通知。