保研机试准备——努力更新ing

这篇博客涵盖了多种编程算法,包括数学问题的解决方案,如反序数、求因子、进制转换;还涉及图形处理,如叠筐问题;日期计算,如闰年判断和日期差值计算;以及字符串操作,如分词和浮点数加法。此外,还讲解了KMP字符串匹配算法和如何优化复杂问题的解题思路。文章强调了STL的使用技巧,并给出了各种编程小技巧和注意事项。
摘要由CSDN通过智能技术生成
1、数学类问题

(1)反序数

int Reverse(int m){
    int a=0;
    while(m!=0){
        int r=m%10;
        a=10*a+r;
        m=m/10;
    }
    return a;
}

(2)求因子(相乘)

	vector<int> F;//求i的因子
    for(int j=1;j<=i/2;j++){
    	if(i%j==0){
			F.push_back(j);
        }
    }

(3)进制转换

vector<int> r;
        while(n!=0){
            r.push_back(n%2);
            n=n/2;
        }
        for(int i=r.size()-1;i>=0;i--){
            cout<<r[i];
        }

2、叠筐
题目 :先保存构建的图形、再输出

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n;
    char a,b;
    while(cin>>n>>a>>b){
        char matrix[80][80];
        for(int i=0;i<=n/2;i++){
            //(i,i)左上角(j,j)右下角
            int j=n-1-i;
            int len=n-2*i;
            char in;
            //判断是内圈还是外圈(不能只用flag因为数量不同,内外圈划分不同)
            if((n/2-i)%2==0)
                in=a;
            else
                in=b;
            for(int k=0;k<len;k++){
            //画个圈
                matrix[i][i+k]=in;
                matrix[i+k][i]=in;
                matrix[j][j-k]=in;
                matrix[j-k][j]=in;
            } 
        }
        //记得判断只有1个的情况
        if(n!=1){
            matrix[0][0]=' ';
            matrix[0][n-1]=' ';
            matrix[n-1][0]=' ';
            matrix[n-1][n-1]=' ';
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                cout<<matrix[i][j];
            }
            printf("\n");
        }
        printf("\n");
    }
}

3、闰年与月份天数
用数组记录天数,方便之后的计算

//月份记录
int daytab[2][13]={
	{0,31,28,31,30,31,30,31,31,30,31,30,31},
	{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
//闰年判断
bool IsLeapYear(int year){
	return ((year%4==0&&year%100!=0)||(year%400==0))
}

4、日期差值
一天天的求

while((y1<y2) || (m1 < m2) || (d1 < d2)){//第一个日期没有达到第二个日期时循环
            d1++;//天数加一
            if(d1 == month[m1][isLeap(y1)]+1){//满当月天数
                m1++;//日期变为下个月的一号
                d1=1;
            }
            if(m1==13){//月份满十二个月
                y1++;//日期变为下一年的一月
                m1=1;
            }
            ans++;//相差天数+1
        }

5、坠落的蚂蚁
题目 当最终结果只关心某个元素时,可以考虑模糊其他元素的身份区别,只关心他们对所求元素的影响,将这种影响抽象出来作为解题思路可以大大降低编程难度。

#include<bits/stdc++.h>
using namespace std;

typedef struct Ant{
    int loc;
    int vel;
};
bool cmp(Ant a1,Ant a2){
    return a1.loc<a2.loc;
}
int main(){
    int N;
    while(cin>>N){
        vector<Ant> ants;
        Ant t;
        int p;
        for(int i=0;i<N;i++){
            cin>>t.loc>>t.vel;
            if(t.vel==0)
                p=t.loc;
            ants.push_back(t);
        }
        vector<Ant> ants_l;
        vector<Ant> ants_r;
        for(int i=0;i<N;i++){
            if(ants[i].loc<p&&ants[i].vel==1){
                ants_l.push_back(ants[i]);
            }else if(ants[i].loc>p&&ants[i].vel==-1){
                ants_r.push_back(ants[i]);
            }
        }
        sort(ants_l.begin(),ants_l.end(),cmp);
        sort(ants_r.begin(),ants_r.end(),cmp);
        int sub=ants_l.size()-ants_r.size();
        if(sub==0){
            cout<<"Cannot fall!"<<endl;
        }else if (sub>0){
            cout<<100-ants_l[sub-1].loc<<endl;
        }else{
            cout<<ants_r[ants_l.size()].loc<<endl;
        }
    }
}

6、将句子分词

while(s.find(' ')!=string::npos){
        int tmp=s.find(' ');
        len=tmp-pos;
        list.push_back(s.substr(pos,len));
        pos=tmp+1;
        s[tmp]='0';
    }

7、浮点加法
题目 对于精度很大的数,直接用float和double没有办法解决,因此用字符串一一进行计算

#include<bits/stdc++.h>
using namespace std;
int main(){
    string num1;
    string num2;
    while(cin>>num1>>num2){
        vector<char> res;
        int sub=0,add=0;
        int p1=num1.find('.');
        int p2=num2.find('.');
        int xiaoshu1=num1.size()-p1-1;
        int xiaoshu2=num2.size()-p2-1;
        for(int i=0;i<abs(p2-p1);i++){
            if(p1<p2)
                num1='0'+num1;
            else
                num2='0'+num2;
        }
        for(int i=0;i<abs(xiaoshu1-xiaoshu2);i++){
            if(xiaoshu1<xiaoshu2)
                num1=num1+'0';
            else
                num2=num2+'0';
        }
        for(int i=num1.size()-1;i>=0;i--){
            if(num1[i]=='.'){
                res.push_back(num1[i]);
            }else{
                add=num1[i]-'0'+num2[i]-'0'+sub;
                if(add>=10)
                    sub=1;
                else
                    sub=0;                    
                res.push_back(add%10+'0');
            }
        }
        for(int i=res.size()-1;i>=0;i--){
            cout<<res[i];
        }
        cout<<endl;
    }
}

8、KMP算法(字符串匹配)

//求解next数组
void getNext(string pattern){
	int k=-1;
	int j=0;
	next[0]=-1;
	while(j<pattern.size()-1){
		if(k==-1||pattern[k]==pattern[j]){
			k++;
			j++;
			next[j]=k;
		}else{
			k=next[k];
		}
	}
}
void KMP(string txt,string pattern){
		int i = 0, j = 0;
		while (i < txt.size() && j < pattern.size()) {
			if (j == -1 || s1[i] == s2[j]) {
				i++;
				j++;
			}
			else {
				j = Next[j];
			}
			//多次匹配
			if(j==pattern.size()){
				number++;//记录次数
				j=Next[j];
			}
		}
		//只需要匹配一次
		if (j >= n2) {
			cout << i - n2+1 << endl;
		}
		else
			cout << -1 << endl;
	}
}

STL使用

  1. string(1)找子串(可以是字符也可以是字符串)find(a),返回匹配到的位置,否则返回string::npos

注意事项List

  1. break只能终止距离它最近的循环(循环!!
  2. while(scanf("%d",&m)!=EOF)用于不知道结尾的多循环体。scanf的返回值是成功赋值的变量数目,如果都没有成功赋值,返回-1(EOF
  3. sort(first,end,cmp)排序,其中cmp可以自定义,当返回true的时候,第一个元素排在第二个元素之前
  4. 需要按位读取数字的时候,可以直接用string类型
  5. 统计字母的时候,可以利用字母的ASCII码,转换为数字保存
  6. 数据转换(1)
	char到string:利用string(size_t n, char c)
	char a = 48;
	string b(1,a); //正确
	string到char*:利用c_str()
	char* c; 
	string s="1234"; 
	c = s.c_str();
  1. printf/scanf(格式化)速度比cin/cout(流)快,cout之所以效率低,是先把要输出的东西存入缓冲区,再输出,导致效率降低。
    string字符串查找比char*
  2. char保存字符串数组最后一位是'\0'
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值