关于Java数组越界的一个诡异问题【leetcode204】

刷leetcode204时,质数计算,在看完改进算法后有个测试怎么也过不了,数据越界报错:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -2146737495

仔细看都没有找到原因,其中最后两行输出为:

499813 499979  701  713

-2146737495 499979  46349  46349

很纳闷,怎么突然从701跳到了46349,而且i*j<n也是验证过的,这个疑惑只在CSDN上找到这样一个问答:

请帮忙看一下这个程序为什么会产生这样的异常 [问题点数:20分]

没错,因为代码中没有对i和j进行限制,所以它们会一直增长,知道超过int边界,此时它们的乘积为负,负数当然是小于n,但是数组中肯定没有这样的地址!最后贴出问题代码供参考:

public class Solution204 {
    public int countPrimes(int n) {
        boolean isPrime[] = new boolean[n];
        for(int i = 0 ; i < n ; i++)
            isPrime[i] = true;
        int num = 0;
        for(int i = 2 ; i < n ; i++){
            if(!isPrime[i])
                continue;
            for(int j = i ; j*i < n ; j++) {
                System.out.println(j * i + " " + n + "  " + i + "  " + j);
                isPrime[j * i] = false;<span style="white-space:pre">	</span>//当i和j很大时,它们的乘积仍然符合n,但是产生了越界异常
            }
        }
        for(int i = 2 ; i < n ; i++)
            if(isPrime[i] == true)
                num++;
        return num;
    }

    public static void main(String[] args) {
        int n = new Solution204().countPrimes(499979);
        System.out.println(n);
    }
}

另外,关于Sieve找质数算法可以看看wiki:

wiki:Sieve of Eratosthenes

时间: 2024-12-25 12:48:16

关于Java数组越界的一个诡异问题【leetcode204】的相关文章

从一道简单模拟题看数组越界以及其他

题目要求比较明确,可能做起来难度不是很大. 但我这道题用了比较久的时间. 原因是我用了一种特别容易错的方法.我在移动数组元素的时候采用不用辅助数组由前往后复制的方法(想来我也真是没事找事干),然后在这种方法下我起初交了许多遍WA,然后自己经过长时间的测试终于发现了问题所在,不止一个,各种逻辑错误. 总结主要有以下几点: 分类讨论不够明确,不够完整 没有考虑到前边操作对后边数据的影响 没有意识到数组越界的后果(a[-1],a[maxn]) 要发现和解决这些问题并不容易,需要有很高的调试技巧,通过这

Java中的数组越界问题

Java中数组初始化和OC其实是一样的,分为动态初始化和静态初始化, 动态初始化:指定长度,由系统给出初始化值 静态初始化:给出初始化值,由系统给出长度 在我们使用数组时最容易出现的就是数组越界问题,好了,下面来演示一下 int [][] array = {{1,2,3},{1,4}}; System.out.println(array[1][2]); 这是一个二维数组,很明显,数组越界了,控制台中会打印如下信息: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px;

七、如何在Java中高效检查一个数组是否含有一个值

如何检查一个数组(非排序的)是否包含特定的值.这是个非常有用或经常被在Java中使用.这是个在Stack Overflow中高得票的问题.在已经高得票的答案中,有许多不同的处理方法,但是时间的复杂度非常不同.在下面,我将会展示每种方法的时间花费. 一.四种不同的方法去检查一个数组包含特定的值 1) 用List public static boolean useList(String[] arr, String targetValue) { return Arrays.asList(arr).co

剑指offer(Java版)第一题:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。 *请找出数组中任意一个重复的数字。 *例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字2或者3。

/*在一个长度为n的数组里的所有数字都在0到n-1的范围内. * 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次. * 请找出数组中任意一个重复的数字. * 例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字2或者3.*/ import java.util.*; public class Class1 { static class findRepeatedNumber{ public int findRepeatedN

Exception in thread &quot;main&quot; java.lang.ArrayIndexOutOfBoundsException: 数组越界

程序出现了以下报错是什么原因呢? Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 at case50.Case07.main(Case07.java:25) 是数组越界了 for (int i = 0; i <= ch.length; i++) { //数组角标从零开始,在这里应为 i < ch.length if (ch[i] >= '0' && ch[i]

Android 【问题汇总】列表数组越界的问题

遇到了一个诡异的问题,ListView发生数组越界(偶尔会),程序崩溃. 错误信息如下: W/dalvikvm( 5176): threadid=1: thread exiting with uncaught exception (group=0x40015568) E/zhe800_android( 5176): Invalid index 2, size is 0 E/zhe800_android( 5176): java.lang.IndexOutOfBoundsException: In

java数组

  数组:            java中,数组就是一个变量,用于将相同的数据类型的数据存储在内存中.数组中的每一个数据元素都属于同一数据类型. 数组的基本要素: 1).标识符.和变量一样,在计算机中,数组也要有名称,称为标识符,用来区分不同的数组. 2).数组元素.当给出了数组名称,即数组标识符后,要向数组中存储数据,这些数据就称为:数组元素. 3).数组下标.在数组中,为了正确的得到数组元素,需要对他进行编号,这样计算机才能根据编号去存取,这个编号就称为数组下标. 4).元素类型.存储在数

JAVA数组的定义及用法

数组是有序数据的集合,数组中的每一个元素具有同样的数组名和下标来唯一地确定数组中的元素. 1. 一维数组 1.1 一维数组的定义 type arrayName[]; type[] arrayName; 当中类型(type)能够为Java中随意的数据类型,包含简单类型组合类型,数组名arrayName为一个合法的标识符,[]指明该变量是一个数组类型变量. 另外一种形式对C++开发人员可能认为非常奇怪,只是对JAVA或C#这种开发语言来说,另外一种形式可能更直观,由于这里定义的仅仅是个变量而已,系统

Java - 数组解析

java提高篇(十八)-----数组之一:认识JAVA数组 一.什么是数组 数组?什么是数组?在我印象中的数组是应该这样的:通过new关键字创建并组装他们,通过使用整形索引值访问它的元素,并且它的尺寸是不可变的! 但是这只是数组的最表面的东西!深一点?就是这样:数组是一个简单的复合数据类型,它是一系列有序数据的集合,它当中的每一个数据都具有相同的数据类型,我们通过数组名加上一个不会越界下标值来唯一确定数组中的元素. 还有更深的,那就是数组是一个特殊的对象!!(对于这个LZ理解的不是很好,对JVM