我已经实施了一个幼稚的方法。这是我的方法。他们是否仍在改进此代码的运行时复杂性?
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的数字吗?
答案 0 :(得分:0)
另一个想法是创建一个大小为10(每个数字)的数组,仅对每个数字计数,而无需检查数字是偶数还是奇数!然后,只需将0
,2
,4
,6
和8
的值之和报告为偶数位数,并执行相同的操作赔率。
使用此技巧,您可以删除此比较rem % 2 == 0
,这样可能会更有效率。
答案 1 :(得分:0)
否,没有办法提高代码的运行时复杂性。它在 O(n)中运行,其中 n 是您的数字位数。如果不依次考虑每个数字,就无法计数奇数和偶数,因此我们不能做得更好。
我没有回答第二个问题,即是否可以在不到1秒的时间内计算出高达10 ^ 18的数字。可能会有一些创造性的可能性。我正在考虑在18个嵌套循环中迭代最多18个数字中每个数字的可能值,或者使用递归。因此,一旦您确定1为奇数,就可以使用此信息遍历100000000000000000000-199999999999999999999,等等。