计算整数中的偶数和奇数位?

时间:2019-07-14 06:33:42

标签: java algorithm runtime

我已经实施了一个幼稚的方法。这是我的方法。他们是否仍在改进此代码的运行时复杂性?

  class GFG
{
    static int countEvenOdd(int n)
    {
        int even_count = 0;
        int odd_count = 0;
        while (n > 0)
        {
            int rem = n % 10;
            if (rem % 2 == 0)
                even_count++;
            else
                odd_count++;
            n = n / 10;
        }
        System.out.println("Even count : " +
                even_count);
        System.out.println("Odd count : " +
                odd_count);
        if (even_count % 2 == 0 &&
                odd_count % 2 != 0)
            return 1;
        else
            return 0;
    }

    // Driver Code 
    public static void main(String[] args)
    {
        int n;
        n = 2335453;
        int t = countEvenOdd(n);

        if (t == 1)
            System.out.println("YES");
        else
            System.out.println("NO");

    }
} 

反正我可以改进他们的方法,使其在不到1秒的时间内计算出高达10 ^ 18的数字吗?

2 个答案:

答案 0 :(得分:0)

另一个想法是创建一个大小为10(每个数字)的数组,仅对每个数字计数,而无需检查数字是偶数还是奇数!然后,只需将02468的值之和报告为偶数位数,并执行相同的操作赔率。

使用此技巧,您可以删除此比较rem % 2 == 0,这样可能会更有效率。

答案 1 :(得分:0)

否,没有办法提高代码的运行时复杂性。它在 O(n)中运行,其中 n 是您的数字位数。如果不依次考虑每个数字,就无法计数奇数和偶数,因此我们不能做得更好。

我没有回答第二个问题,即是否可以在不到1秒的时间内计算出高达10 ^ 18的数字。可能会有一些创造性的可能性。我正在考虑在18个嵌套循环中迭代最多18个数字中每个数字的可能值,或者使用递归。因此,一旦您确定1为奇数,就可以使用此信息遍历100000000000000000000-199999999999999999999,等等。