【问题标题】:in repeated string finding the total number of time the occurrence of any character在重复的字符串中查找任何字符出现的总次数
【发布时间】:2018-12-02 06:55:11
【问题描述】:

给定一个整数n,找出并打印无限字符串前n个字母中字母a的个数。

例如,如果字符串 s='abcac' 且 n=10,我们考虑的子字符串是 abcacabcac ,她的无限字符串的前 10 个字符。子字符串中出现了 4 次 a。

static long repeatedString(String s, long n) {
        long len = s.length(), count = 0;
        StringBuilder sb = new StringBuilder("");
        char[] c = s.toCharArray();
        for (int i = 0; i < n; i++) {
            sb.append(c[(i % len)]);
            if (sb.charAt(i) == 'a')
                count++;
        }
        return count;
    }

显示错误

不兼容的类型:从 long 到 int 的可能有损转换 sb.append(c[i%len]);

如果我是类型转换 len 那么它没有通过长度大于 10^9 的值的测试用例,例如如果我的输入是

一个
1000000000000

那么输出必须是1000000000000

note-> 对于任何给定的输入,我必须计算“a”的总数 出现在给定的字符串中

编辑:我将我的函数称为

长结果 = 重复字符串("a", 1000000000000);

【问题讨论】:

  • sb.append(c[(int) (i%len)]);
  • 已经尝试过,o/p 只是错误

标签: java arrays


【解决方案1】:

您的部分问题似乎有点含糊,但从最后一行,我明白了,您想查找字符串中特定字符的出现次数。

您可以使用HashMap 来添加字符串的唯一字符并将值设置为字符的出现次数。

我在说什么,在代码中看起来像这样:

HashMap<Character,Integer> hm = new HashMap<Character,Integer>();

char[] str = s.toCharArray();

for(char c : str) {

    if(hm.containsKey(c))
        hm.put(c, hm.get(c)+1);

    else
        hm.put(c, 1);
}

现在您可以在字符串中选择您选择的字符来获取它的出现次数,如下所示:

if(hm.get(character)!=null)
    ans = hm.get(character);

else
    ans = 0;

还有一个图书馆,我在做for this here.

编辑:

从编辑中,问题更加清晰,因为您需要做的就是将字符串的字符添加到前一个字符串,直到满足长度。

之后,您可以像我在此处给出的代码中一样使用新字符串。

【讨论】:

  • char[] str = s.toCharArray(); 在内存中创建额外的字符数组。根据这种情况,s.charAt(i) 更适合遍历字符。
【解决方案2】:

您不需要 StringBuilder。
通过迭代初始字符串并根据需要多次乘以得到你想要的结果,意思是(n / len),然后加上除法剩下的部分:

static long repeatedString(String s, long n) {
    long len = s.length();

    if (len == 0)
        return 0;

    long rep = n / len;
    long count = 0;

    for (int i = 0; i < len; i++) {
        if (s.charAt(i) == 'a')
            count++;
    }

    count *= rep;

    long rest = n % len;

    for (int i = 0; i < rest; i++) {
        if (s.charAt(i) == 'a')
            count++;
    }
    return count;
}

【讨论】:

  • 正确的解决方案,但您不必遍历字符串 TWICE
  • 对,第二次换子串。
  • 是的,我明白了。这是不必要的。您可以将其移至第一个循环。如果n = str.length() - 1n = 1_000_000.
  • @RAVIKUMARSHARMACSE16 你不需要它。仅当您想通过重复附加来构造大字符串时才使用 StringBuilder。你不需要这个来解决这个问题。
  • @RAVIKUMARSHARMACSE16 您选择了一种效率低下的方法。解决方案更简单。
【解决方案3】:

我认为您不必使用StringBuidler(此外,对于大n,这可能会流动OutOfMemoryError),但可以即时计算所需的字母。

public static long repeatedString(String str, long n, char ch) {
    long count = 0;

    for (int i = 0; i < str.length(); i++) {
        if (str.charAt(i) == ch)
            continue;

        count += n / str.length();
        count += i < n % str.length() ? 1 : 0;
    }

    return count;
}

【讨论】:

    猜你喜欢
    • 2018-01-30
    • 2021-01-11
    • 1970-01-01
    • 2012-05-10
    • 2011-04-15
    • 1970-01-01
    • 2017-10-23
    • 2012-12-26
    相关资源
    最近更新 更多