1

我需要一些关于以下逻辑的输入。

它是一种计费系统,接受输入并具有与之相关的值。

A = 2 , 3A = 5
B = 3
C = 1 , 4C = 3

我的代码应该采用 ABCCBAACCA ,输出应该是 16 的值。

到目前为止,我的解决方案是,我正在考虑对字符串中的每个元素进行计数,对于 A ,它们 mod(modulus) 乘以 3,对于 C 乘以 4(如上例所示,在 B 的情况下不需要)每个元素,以便得到结果。

我很困惑我应该使用什么数据结构来实现这样的系统。

4

4 回答 4

1

好吧,模数运算符对您没有帮助,因为您每次都会得到 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
于 2012-05-11T15:37:06.227 回答
1

在伪代码中,我相信它会是:

计算所有 A、B 和 C

  1. 将 A 除以 3 并乘以 5

  2. 模 A 乘以 3 并乘以 2

  3. 将 B 乘以 3

  4. 将 C 除以 4 并乘以 3

  5. 模数 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
于 2012-05-11T15:44:23.157 回答
1

好吧,我会从这样的事情开始:

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 放到映射中。

于 2012-05-11T16:01:22.273 回答
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
于 2012-05-11T17:09:30.723 回答