首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BIlling系统-编程

BIlling系统-编程
EN

Stack Overflow用户
提问于 2012-05-11 23:13:59
回答 4查看 2.4K关注 0票数 1

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

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

代码语言:javascript
复制
A = 2 , 3A = 5
B = 3
C = 1 , 4C = 3

我的代码,应该是这样的ABCCBAACCA,输出应该是16的值。

到目前为止,我的解决方案是计算字符串中的每个元素,并将A的模数为3,C的模数为4(就像上面的情况一样,B的情况下不需要),以获得结果。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-11 23:44:23

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

数数所有的A,B和C

  1. 将A除以3,再乘以5
  2. 模A,再乘以2
  3. 将B乘以3,
  4. 将C除以4,再乘以3

<代码>H19模C乘以4<代码>H210<代码>G211

将5个结果求和。

在Ruby中,它可能像这样:

代码语言:javascript
复制
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}"

这会产生:

代码语言:javascript
复制
A: 7
B: 6
C: 3
Total: 16
票数 1
EN

Stack Overflow用户

发布于 2012-05-11 23:37:06

嗯,模运算符不会帮到你,因为你每次都会得到0,是3的倍数还是5的倍数,这取决于你评估的字母(如果这是你试图描述的,如果我弄错了,很抱歉)。

我认为最简单的方法是扫描字符串,然后将值相加。

当你遇到第三个A时,你只需添加1,而不是2(因为你必须减去4,然后添加5)与C类似,当你遇到第四个C时,您只需添加0,而不是1。

你需要两个额外的变量来保持A和C的实例,是的,你可以使用模运算符来知道你是否刚刚到达倍数,你必须添加1或0,这取决于具体情况。

希望这能对你有所帮助。

编辑:在这里,我做了一个快速实现。如果您真的需要它,请随意优化它;)

代码语言:javascript
复制
    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
票数 1
EN

Stack Overflow用户

发布于 2012-05-12 00:01:22

好吧,我会从下面这样的东西开始:

代码语言:javascript
复制
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放到映射中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10554114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档