1 Coding style and STL summary

STL,基础数学

算法类型Structurefunction备注
不变序列算法O(n)顺序容器/关联容器均适用iterator min_element(iterator first, iterator last[,Pred op])
iterator max_element(iterator first, iterator last[,Pred op])
int count(iterator first, iterator last,const T& val)
iterator find(iterator first, iterator last,const T& val)
插入算法第一个被插入元素的迭代器firstSingle elementvectoriterator insert (const_iterator position, const value_type& val);
setpair<iterator,bool> insert (const value_type& val);pair::second inserted(1)or existed(0)
Stringstring& insert (size_t pos, const char* s);
Fillvectoriterator insert (const_iterator position, size_type n, const value_type& val);
Stringstring& insert (size_t pos, size_t n, char c);
Rangevector,Stringiterator insert (const_iterator position, InputIterator first, InputIterator last);
BufferStringstring& insert(size_t pos, const string& str, size_t subpos, size_t sublen);个数
删除算法返回被删除元素的下一个迭代器lastSingle elementvector,setiterator erase (const_iterator position);
Unfillsetsize_type erase(const value_type& val);个数
Rangevector,setiterator erase(const_iterator first, const_iterator last);

1.输入方式大总结

getline(cin,str):
std::basic_istream& getline(std::basic_istream&__is, std::__cxx11::basic_string& __str);

//解析一个字符的三种方式
scanf("%c",&ch);
ch=cin.get();
ch=getchar();
//解析一个字符串的方式
char m[20];//gets函数如果读取了换行符会将其自动转换成字符串结束符'\0'
gets(m);     
cin.getline(m,5);//多了一个参数,可以加结束符
cin.get(m,20);//多了一个参数,可以加结束符

%2d就是将数字按照宽度为2 采用右对齐方式输出,若数据位数不到2位,则左边补空格

%02d和%2d差不多 只不过左边补0

toupper,tolower的使用

2.初始化

等值

//vector
vector<vector<int>>v(8,vector<int>(8,0));
//e[][]
fill(e[0],e[0]+510*510,0);

不等值

void iota(iterator first,iterator last,T val)
[first,last)从val连续赋值

3."对应"的处理

[易错点]0/1开头
1开头好处:避免map、lchild、rchild问题

法1:建表
char c[14] = {"0123456789ABC"};
printf("#");
for(int i = 0; i < 3; i++) {
    int num;
    scanf("%d", &num);
    printf("%c%c", c[num/13], c[num%13]);
}
return 0;
法2:直接函数输出

4.cmp的写法

int cmp(node& a, node& b) {//Tips:引用传递和地址传递效率高于直接传递
	if ((a.de1 + a.cai) != (b.de + b.cai))        
        return (a.de + a.cai) > (b.de + b.cai);//技巧:以求和代替求平均值
	else if (a.de != b.de) return a.de > b.de;
	else return strcmp(a.name, b.name) < 0;//char name[9]
        //还可以string a.name<b.name;
}

并列排名问题

struct node {
	int id, best;
	int score[4], rank[4];
};//一般一个结构体
for(i=0;i<sch.size();++i){
 for(j=0;j<k;++j){
        bool y;
        int choice=sch[i].sc[j];
        int x=ans[choice].size();
        if(x>0){
            int last=x-1;
            y=sch[i].grade[0]==ans[choice][last].grade[0]&&sch[i].grade[1]==ans[choice][last].grade[1];
            x=y?ans[choice][last].rank:x;
        }
        if(x<full[choice]||y){
            ans[sch[i].sc[j]].push_back(sch[i];
            break;
        }
}
for(flag = 0; flag <= 2; flag++) {
        sort(ans.begin(), ans.end(), cmp1);
        for(int i = 0; i < n; i++) {
            ans[i].rank[flag] = i;
            if(i>0&&ans[i].grade[flag] == ans[i-1].grade[flag])//注意多一个判断还有反向            
            ans[i].ans[flag] = ans[i-1].rank[flag];
        }
}

5.输出格式

flag设置问题

Leetcode98 指针空间复杂度O(1)

int* last = NULL;//flag
bool isValidBST(TreeNode* root) {
   if (root){
         if(!isValidBST(root->left)) return false;
         if (last && *last>=root->val) return false;//第一次智慧执行下面
         last = &root->val;
         if(!isValidBST(root->right)) return false;
         return true;
   }else return true;
};

普通输出问题

for (int i = 0; i < 4; i++) {
	sort(v[i].begin(), v[i].end(), cmp);
	for (int j = 0; j < v[i].size(); j++){//小技巧:利用顺序条件,如求一串码中只出现一次的元素
        if(j!=0)printf(" ");
		printf("%d", v[i][j].num);
    }
    printf("\n");
}

条件补零问题Eg:保留n位小数(temp.size可大可小)

while(temp.size()<N)//有效数字位数小于N
temp+="0";//在字符串末尾加足够的0保证有N位有效数字

6.排序题

多维排序–>找参考系

1比较时间实际可以t[j]-t[i](从0:0:0开始)

2求连续字符串和满足一定条件-->sum[j]-sum[i]

[易错点]多余链表、记录的问题
[易错点]sum有n+1个(还有0)

PAT1016 Phone Bills

夹逼题:[a,b]!c

for(j=temp;st[j].time<=cal(c)&&j<st.size();++j)
    if(st[j].status==0)sum++;
    else sum--;

//[f,l),[,Compare comp]
void pop_heap(iterator first, iterator last);//向下调整,原堆顶->last-1,O(log(n))
void push_heap(iterator first, iterator last);//向上调整O(log(n))
void make_heap(iterator first, iterator last);//建堆O(n)
void sort_heap(iterator first, iterator last);//建堆后排序O(nlog(n))

7.运行超时:

  • 循环内套了一个大函数:如循环内sort(>1000),或是一个大数组( 1 0 5 10^5 105)的cin–>scanf

Eg:i<strlen(s),每次求长度

  • 外循环与内循环条件对换,可以减少重复

8.逻辑错误

  • for:scanf()循环加了求sum或者列表问题,但还没sort呢
  • while和for的取舍,关键在于更新语句,一定要事先考虑update是否在所有结构均存在
while(){
	if(){update;}
	else(){update;}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值