我需要一些关于以下逻辑的输入。
它是一种计费系统,接受输入并具有与之相关的值。
A = 2 , 3A = 5
B = 3
C = 1 , 4C = 3
我的代码应该采用 ABCCBAACCA ,输出应该是 16 的值。
到目前为止,我的解决方案是,我正在考虑对字符串中的每个元素进行计数,对于 A ,它们 mod(modulus) 乘以 3,对于 C 乘以 4(如上例所示,在 B 的情况下不需要)每个元素,以便得到结果。
我很困惑我应该使用什么数据结构来实现这样的系统。
好吧,模数运算符对您没有帮助,因为您每次都会得到 0 是 3 或 5 的倍数,具体取决于您正在评估的字母(如果这就是您要描述的内容,如果我弄错了,对不起)。
我相信最简单的方法是扫描字符串并添加值。
当你遇到第三个 A 时,你只加 1,而不是 2(因为你必须减去 4,然后加 5)与 C 类似,当你遇到第四个 C 时,你只加 0,而不是 1。
您需要 2 个额外的变量来保留 A 和 C 的实例,是的,您可以使用模运算符来了解您是否刚刚到达一个倍数,您必须根据具体情况添加 1 或 0。
希望这个对你有帮助。
编辑:在这里,我做了一个快速的实现。如果您真的需要它,请随意优化它;)
String value = "ABCCBAACCA";
int numA =0;
int numC =0;
int endResult = 0;
for (int x = 0; x < value.length(); x++)
{
if (value.charAt(x) =='A')
{
numA = numA +1;
endResult = endResult + ((numA%3 == 0)?1:2);
}
else if (value.charAt(x) =='B')
{
endResult = endResult +3;
}
else if (value.charAt(x) =='C')
{
numC = numC +1;
endResult = endResult + ((numC%4 == 0)?0:1);
}
}
System.out.println(endResult); //16 as expected
在伪代码中,我相信它会是:
计算所有 A、B 和 C
将 A 除以 3 并乘以 5
模 A 乘以 3 并乘以 2
将 B 乘以 3
将 C 除以 4 并乘以 3
模数 C 的 4
将 5 个结果相加。
在 Ruby 中,它可能像这样:
input = "ABCCBAACCA"
letters = ["A", "B", "C"]
total = 0
def score(letter,count)
if letter == "A"
((count/3)*5)+((count%3)*2)
elsif letter == "B"
count*3
else letter == "C"
((count/4)*3)+(count%4)
end
end
letters.each do |letter|
puts "#{letter}: #{score(letter, input.count(letter))}"
total += score(letter, input.count(letter))
end
puts "Total: #{total}"
产生:
A: 7
B: 6
C: 3
Total: 16
好吧,我会从这样的事情开始:
public static void main(String[] args) {
// FIXME
String inputString = null;
Map<Character, Integer> map = new HashMap<Character, Integer>();
for (Character c : inputString.toCharArray()) {
map = countCharacters(map, c);
}
}
private static Map<Character, Integer> countCharacters(Map<Character, Integer> map,
Character charatcer) {
map.put(charatcer,
(map.get(charatcer) != null) ? map.get(charatcer) + 1 :
Integer.valueOf(1));
return map;
}
然后从第二步到第五步引入@vlasits,因为上面的代码是他伪代码的第一步。它通过制作“character”的映射来计算字符串中的所有字符:“its Occurences”,如果之前没有这样的字符,它会将 1 放到映射中。
class CharBucket
attr_accessor :count
def initialize(thresholds)
@thresholds = thresholds
@count = 0
end
def total
@thresholds.inject([0, @count]) do |sum_left, a|
sum = sum_left[0]
left = sum_left[1]
sum += (left / a[0]) * a[1]
left %= a[0]
[sum, left]
end[0]
end
end
a = CharBucket.new({3 => 5, 1 => 2})
b = CharBucket.new({1 => 3})
c = CharBucket.new({4 => 3, 1 => 1})
buckets = {'A' => a, 'B' => b, 'C' => c}
"ABCCBAACCA".each_char{|c| buckets[c].count += 1 }
total = buckets.values.inject(0){|sum, b| sum += b.total} # => 16