java刷题遇到的各种错误集合

强制类型转换注意括号

int x=(int)b%10;

int x=(int)(b%10);

Non Zero Exit Code
可能是程序没法终止
比如

本应该while(q--){}
写成了while(n--){}
调试了半天才发现样例虽然过了,但是程序都没终止

爆int 甚至爆long

所以平时写循环(特别是以判断为目的的循环,尽可能地去考虑优化,不仅为时间,也为防止溢出)

在循环加法中,特别是加速度增加的循环加法,需要考虑控制条件,
将加法结果爆整数前结束循环
例如
for(int i=1;i<=n;++i)
		{
			m+=(m-a[i]);
			if(m>ma)return true;//控制条件
			if(m<0)return false;
		}

逆向循环写–i而不是++i !!! (比赛时就写错了,因为手机热点断网,没能改回来,血亏)

for(int i=n;i>=1;--i)

求逆序对的数量,计数的变量爆int…


2022.1.18
读一行的函数之前可能有上面的回车符还未读
比如下面样例:
读完数字后,不管是c++的getline()还是java的nextLine();都会读到3后面的回车符,因此需要先调用一次getline或者是nextline把这个回车符吸收掉,否则会出现错误

3
17:48:19 21:57:24
11:05:18 15:14:23
17:21:07 00:31:46 (+1)
23:02:41 16:13:20 (+1)
10:19:19 20:41:24
22:19:04 16:41:09 (+1)

2022.1.18
循环嵌套时,写for(int j=0;j<4;++i)导致的死循环


2022.1.19 写线段树时一个非常隐秘的错误,找bug找到怀疑人生。
即build函数中,l==r时即叶节点初始化,他的sum应该=这个点的原数组的值,即tr[u].sum=w[r]//r或者l,但是容易写成w[u].//u是线段树的结点编号啊大哥

static void build(int u,int l,int r)
	{
		tr[u]=new node();
		tr[u].l=l;
		tr[u].r=r;
		if(l==r)tr[u].sum=w[r];
		else
		{
			int mid=l+r>>1;
			build(u<<1,l,mid);
			build(u<<1|1,mid+1,r);
			pushup(u);
		

2022.1.30
递归时的中间变量声明为全局变量,会出现非常难调试的错误!!!!!
写任何递归时都要注意递归的中间变量作用域!!!
写任何递归时都要注意递归的中间变量作用域!!!
写任何递归时都要注意递归的中间变量作用域!!!


邻接表存储无向图时候,数组开的大小应该是边的两倍!!!!
用邻接表还要考虑自环和重边的影响!!!

2022.2.8
自定义类型排序异常,但是代码看着没什么问题
实际上因为Comparator里面有根据浮点数的比较来返回正负数。但是下面的x2-x1未加括号导致x2可能为0,k可能为无穷大。导致比较函数里面出现未定义的错误。

double k=(double)(y2-y1)/x2-x1;

double k=(double)(y2-y1)/(x2-x1);

2021.2.16
java和c++的char数组的输出方式不同

java:
s[]="123456";
s[1]='\0';
sout(s)会输出"1 3456"

c++:
s[]="123456";
s[1]='\0';
cout(s)会输出"1"

未完待续

posted @ 2022-11-17 23:00  林动  阅读(14)  评论(0编辑  收藏  举报