2021-08-01

暑假学习部分总结(这个不是7月的总结)
2021-8-1
一,难点或者是容易混淆的点。
1,gets()可以取消掉换行。如果在gets后面写一个getchar()是不会读入空格的。
2,while(cin>>tenp)和while(scanf("%d",&temp)==1) 判断已经读完。或者是用eof函数。
3,结构体变量的初始化和数组的初始化类似,例如 student op={“gao”,67,76,183}
4,写Syria. strub. math时候不用加括号,因为. 优先级较高,具有左结合性。
5,无类型指针,void p.可以将任何类型的地址存放进这个指针里,但是访问时必须强制类型转后才能使用。(int ) p
6,函数返回指针。int a(int a)注意在a的两侧没有括号。因为()的优先级高于
,a(int a)是一个函数,而前面是一个返回类型指针。
7,如果一个字符串是另一个字符串的子串。注意题目中没说谁是谁的,要先判断大小然后进行操作。短的一定是长的子串。
8,写常用的比较函数的时候,比如当分数相同的时候看学号,别只写了如果a的分数大于b的分数时候返回一,一定要把a的分数小于b的分数的时候返回零也写上。
二 比较好的题。
1,(这题不是很复杂,但是我写的不是清楚,同学们跳过吧。)题意,如果一个数组,从第一个元素开始(除了最后一个元素以外)每个元素与下一个元素进行按位与操作,结果如果还是等于这个数的话,就称这个数组是增加的数组。咱在给定一个数组a,要求找出一个数组b使得数组a与b进行按位异或操作后得到的数组是增加的。
错误思路,按照按位和的性质,如果和后面一个数进行操作还能得到当前数的话,那后面一个数只能是比当前数多出最高的一位(二进制计算),那只需要进行完异或操作后得到的数组是该类型的即可。如果给出的a数组如果是大于上一个元素的话,只要保留上一个元素的二进制形式,然后把多余的位数加到保留的二进制位数的前面即可。但是如果小于就太麻烦了。
正确思路,首先第一个元素不用动就是得到的新数组。然后将这个元素与a数组的下一个元素进行按位与操作得到新的数组的下一位。然后将这个数与下一个a元素进行按位异或操作得到差值就是b数组的元素。
进行第一部按位与操作可以得到保留上一个元素,和下一个元素的剩余部分。后面一步按位异或操作得到的是b数组元素,也就是新的元素和a元素的差值。
总结,题解只用了不到10行就AC了,实在是妙。看来如果题目中说是用按位操作,咱们首先就要考虑按位操作运算符。

2,离散化基础。
题意,给定一组数,都有自己的数值,序号是按照输入顺序。要求,按照数据的大小输出序号。
思路,建立一个结构体,结构体有三个成员,数据的值,数据的序号,数据排序后的序号。首先按照数据的值进行排序,然后将排序厚的值进行赋值序号,然后按照数据的序号排序,输出排序后得序号即可。

3,行列转换问题。
题意,行,列的范围都小于100000,但是只有几个数有数据。按照列优先的顺序输出数。
思路,如果建立一个100000*100000几乎是不可能的。而且还要保证时间的复杂度。可以说有点难度。
题解。
int *a[100000],x[100000],y[100000],d[100000],c[100000].
y是第i个数据的列,
while(i<=k)
{cin>>x[i]>>y[i]>>d[i];
c[y[i]]++;
}
while(i<k+1)
{
a[y[i]]=new int [c[i]];
i++;
}
while(i!=k+1)
{
*a[y[i]]=d[i];
a[y[i]]++;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值