本科的细节积累

12月7日
LeetCode不能用max(vector.size(), 20)
别忘了int a = 0 初始化。


12月7号

//  素数判断
//  2018/8/2  scienceZ
bool is_prime(int a){
	if (a == 0 || a == 1) return false;
	double k = sqrt(a);
	for (int i = 2; i<=k; i++){
		if (a%i == 0) return false;
	}
	return true;
}

11月26号
1.关于浮点数取整的知识总结:

#include<iostream>  
#include<cmath>  
using namespace std;  
int main()  
{  
    double a=2.5;  
    cout<<ceil(a)<<endl;   //向上取整  
    cout<<floor(a)<<endl;   //向下取整  
    cout<<round(a)<<endl;   //四舍五入  
    //不使用函数实现  
    //向下取整  
    cout<<(int)a<<endl;  
    //向上取整  
    cout<<(a>(int)a?(int)a+1:(int)a)<<endl;  
    //四舍五入  
    cout<<(int)(a+0.5)<<endl;  
    return 0;  
}  

2.关于long long数据类型范围:
unsigned int 0~4294967295
int 2147483648~2147483647
unsigned long 0~4294967295
long 2147483648~2147483647
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:18446744073709551615

__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615

简记:int:2 * 10^9, long long:9 * 10^18。

3.最大公因数,最小公倍数算法:

typedef long long LL;  //longlong(8byte)大于int(4byte) 

LL gcd(LL a, LL b) {    //自己未曾接触过的求两个数最大公因数的算法 
  return b == 0 ? abs(a) : gcd(b, a%b);
}

LL lcm(LL a,LL b){  
        return a*b/gcd(a,b);
}

10月23日
2.数字转字符串:
sprintf(arr,“%d”, a);
3.这道问题暴露的细节错误非常好,以后值得注意。
题目中的输出要求是:
11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103
每10个数字占1行,其间以空格分隔,但行末不得有多余空格。
自己最初的写法是前9个输出printf("%d “, i);最后一个输出printf(”%d\n", i);这是大错特错的形式。当一行不足十个的时候,就gg了。以后类似的格式要求统一行首元素特殊处理,其他元素输出前空格。换个另外单独处理。
4.好错好错哇!!!!!
A2是某一数列加加减减的结果,其最终结果有可能也是0。如果仅仅靠A2是否为0来判断是否输出N就错误了!!!

5.月饼:题目中没说库存和价格都是整数!!!!!
以后一定要认真读题!!!!

10月22日
1.关于c++字符输入问题的最终详细总结:
1.cin几乎等同于scanf(“%s”),这两种读取字符串的方式都是遇到空格和回车就停止。读取的字符串末尾自动补齐‘\0’.最重要的是,不会带走缓冲区里面的换行符。
2.gets(arr), 从标准流中读取一整行字符,直到遇到回车才停止。读取的字符串末尾自动补齐‘\0’。最重要的是,它会带走缓冲区里面的换行符。
3.fgets(arr, num, position), 从目标地址处(position)读取num-1个字符。重点强调是num-1个字符,不是num个,因为最后一个位置会被自动补齐‘\0’。最重要的是,不会带走缓冲区里面的空格与换行符。 也就是说,fgets(arr, num, position)是cin与scanf(“%s”)的特别版(能指定读取字符数量与地址)。
4.getchar(), 只读取一个字符,无论什么字符它都读,什么空格换行它都读。它就是单字符的操作,* 不会在读取的字符串末尾加什么‘\0’,也不会带走缓冲区里面的空格与换行符。*

10月21日
1.尽管有的题目非常水,但是要不要想当然的不考虑时间复杂度的写。1049. 数列的片段和(20)就是一个吸取教训的题目。
2.顺便直接在本题中汇总一些常用的字符串处理函数:
(1).strcat(arr1, arr2):把字符串arr2连接到arr1后面,在末尾自动添加’\0’。如 果arr1结尾没有’\0’,则直接连接。如果arr1末尾有’\0’会被覆盖掉。
(2).strcmp(arr1, arr2):按字典上顺序比较arr1和arr2,返回arr1-arr2的差值。
(3).strcpy(arr1, arr2):直接把arr2复制到arr1中,将arr1原来的串覆盖掉。
(4).strncat(arr1, arr2, count):把字符串arr2中不多于count的字符连接到arr1后面,在末尾自动添加’\0’。如果arr1结尾没有’\0’,则直接连接。如果arr1末尾有’\0’会被覆盖掉。
(5).strncmp(arr1, arr2, count)::按字典上顺序比较arr1和arr2不多于count个字符,返回arr1-arr2的差值。
(6).strncpy(arr1, arr2, count):把arr2中count个字符复制到arr1中去,arr2必须终止符为’\0’,如果arr2字符少于count个则将多个’\0’加到arr1的尾部,知道arr1的字符个数达到count。如果arr2的字符多于count,则结果串arr1末尾无’\0’。
3.本题目有一个细节问题非常重要,以后一定要注意!!!
就是pat测评系统是要求必须在最终输出的最末尾添加换行符的,否则会认为输出格式错误。比如本题目有一个测试点答案为空。但是如果你把换行写进循环时,因为答案为空,程序进不去输出结果的循环,这就导致输出结果少了换行
4.关于map:
map[a] = b;
map.insert(make_pair(a,b));
这两种插入方式均可。
map(a,b);非法,没有这种。
5.通过本题在复习一下sstream:

#include <sstream>

char arr[10] = “10 3 4 6 7 8”;
stringstream ss(arr);
ss >> a1 >> b1 >> c1 >> a2 >> b2 >> c2;

10月18日
1.555555~~~跪求自己好好读题:
最后在一行中输出结果:“The average of K numbers is Y”,其中K是合法输入的个数,Y是它们的平均值,精确到小数点后2位。如果平均值无法计算,则用“Undefined”替换Y。如果K为1,则输出“The average of 1 number is Y”。血的教训!!!。
2.输出一定要认真认真认真认真认真认真检查啊!!!
这道题错的值,错的值。
若用户选择的序号不存在,则输出“Are you kidding me? @/@”。
陷阱是‘\’是转义字符,只打一个输出不出来!!!!!!
3.这道题是好题,不白错。
本题的关键考点在浮点数的位数保留上。
题中要求“在一行中按照“A+Bi”的格式输出两数乘积的常规形式,实部和虚部均保留2位小数。注意:如果B是负数,则应该写成“A-|B|i”的形式。”
只有付出才写成A-|B|i”的形式,但是如果保留两位小数的话,-0.005到0之间的负数会被保留0.00.但是输出判断的时候回判断它为负数,所以会输出-0.00的错误答案。

10月17日
1.判断字母数字函数:头文件#include <cctype>
isdigit©:判断字符是否是数字;
isupper©:判断一个字符是否是大写英文字母
islower©:判断一个字符是否是小写英文字母
isalpha©: 用来判断一个字符是否是英文字母,相当于 isupper©||islower©
isalnum©: 用来判断一个字符是否为英文字母或数字,
相当于 isalpha© || isdigit©
tolower© 转小写;toupper© 转大写

3.字符串转数字函数:头文件#include <stdlib.h>
int atoi ( const char * str ):
从str第一个字符开始扫描,忽略空白字符,直到遇到第一个非空白字符。从这个非空白字符开始转换,直到遇到非数字字符停止转换。atoi接受+、-号。如果第一个非空白字符不是+、-号,也不是数字字符,则不执行转换。atoi允许数字串后跟非数字字符,不影响转换结果。返回值:成功,返回转换结果;如果,没有执行有效的转换,返回0;如果字符串的值超出了int范围,返回INT_MAX或者INT_MIN。

double atof ( const char * str );
从str第一个字符开始扫描,忽略空白字符,直到遇到第一个非空白字符。从这个非空白字符开始转换,直到遇到非有效浮点字符停止转换。atof接受+、-号。如果第一个非空白字符不是+、-号,也不是数字字符,则不执行转换。atof允许数字串后跟非数字字符,不影响转换结果。有效的浮点字符定义为:一个可选的正负号(+,-)后面紧跟一串数字字符(包含小数点“.”),再后面是一个可选部分,指数,指数由e或E,其后面是正负号(正号+可省略),再加一串数字字符组成。返回值:成功,返回转换结果;如果没有执行有效的转换,返回0.0;如果字符串的值超出double的范围,返回HUGE_VAL。

4.自定义排序:

bool mysort(node a, node b){
	if (a.high!=b.high) return a.high>b.high;
	int t = strcmp(a.name, b.name);
	return t<0;//按字典顺组升序
}

2.双端队列deque:
Constructors 创建一个新双向队列
Operators 比较和赋值双向队列
assign() 设置双向队列的值
at() 返回指定的元素
back() 返回最后一个元素
begin() 返回指向第一个元素的迭代器
clear() 删除所有元素
empty() 返回真如果双向队列为空
end() 返回指向尾部的迭代器
erase() 删除一个元素
front() 返回第一个元素
get_allocator() 返回双向队列的配置器
insert() 插入一个元素到双向队列中
max_size() 返回双向队列能容纳的最大元素个数
pop_back() 删除尾部的元素
pop_front() 删除头部的元素
push_back() 在尾部加入一个元素
push_front() 在头部加入一个元素
rbegin() 返回指向尾部的逆向迭代器
rend() 返回指向头部的逆向迭代器
resize() 改变双向队列的大小
size() 返回双向队列中元素的个数
swap() 和另一个双向队列交换元素

10月15日
1.0是一个特别容易出错的数值。要牢记数组下标为0,如何输出00000?如何清除无用的0前缀?以及当结果是0的时候,某些关键变量是0的时候,被除数是0的时候会不会有问题。
2.当被除数是0的时候,程序运行会非法访问。

10月8日
1.数组越界永远要仔细检查咋。
2.反复校对好输出变量是否正确。

3月16日
1.结构体的初始化构造函数:

struct Edge{
    int start,end;
    double weight;
    Edge(int start,int end,int weight):start(start),end(end),weight(weight){};
};

2.fill函数

按照单元赋值,将一个区间的元素都赋同一个值
在头文件里面

#include <cstdio>
#include <algorithm>
using namespace std;
int main() {
    int arr[10];
    fill(arr, arr + 10, 2);
    return 0;
}

vector也可以

#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
int main(){
    vector<int> v{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    fill(v.begin(), v.end(), -1);
    return 0;
}    

3.memset函数

按照字节填充某字符
在头文件里面

#include <iostream>
#include <cstring>
using namespace std;
int main(){
    int a[20];
    memset(a, 0, sizeof a);//注意与fill参数位置不同
    return 0;
}

4.pair 与 make_pair:
说白了,pair必须在定义了内部数据类型之后,才能使用pair(x,y)构造函数。
而make_pair()无需之前定义,拿来就可以直接生成pair()对象。
比如:

map<int, int> arr;


int main()
{
    arr.insert(make_pair(1,1));//正确
    arr.insert(pair(2,2));//错误
}

3月17日
1.printf("%.2lf");可能会出现5舍6入的情况。关于测试数据37.98,可能由于编译器版本不同,在我编译器上也出现了37.975保留两位小数变成37.97的情况,5舍6入,此时最好的处理办法就是在结果上加上0.001.

2、
sscanf(a, “%d”, &b) 从字符串数组a中读取b
sprintf(a, “%d”, b)将b输出到字符数组a
3、swap(arr[i], arr[j);

12月30日
1、vector初始化:
vector ilist = {1,2,3.0,4,5,6,7};
vector ilist {1,2,3.0,4,5,6,7};
ilist 初始化为列表中元素的拷贝,列表中元素必须与ilist的元素类型相容,本例中必须是与整数类型相容的类型,整形会直接拷贝,其他类型会进行类型转换。
原文链接:https://blog.csdn.net/veghlreywg/article/details/80400382

12月31日
1、 map<int, int> bi;
如果key不存在
bi.count(key) == 0;
bi[key] == 0;
但是只要bi[key]被使用过一次,哪怕没有手动赋值,c++会自动赋值为0,所以之后的bi.count(key) != 0;

1月1日
1、vector在头部插入新元素:
vector& digits;
digits.insert(digits.begin(), 1);

2、map遍历元素:

 map<string, vector<string>>:: iterator ite = ans.begin();
        vector<vector<string>> arr;
        while (ite != ans.end()) {
            arr.push_back(ite->second);
            ite++;
        }
        return arr;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

精彩还在继续

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值