数据结构与算法题

  1. 123456789中插入+/
#include <stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
#include<sstream>
#include<string>


int parse(const char *arr, int pos, int len){
	int ansx = 0;
	int t=1;
	for(int i=pos+len-1;i>=pos;--i){
		ansx +=(arr[i]-'0')*t;
		t = t*10;
	}
	return ansx;
}


int main(){
	int n, ans=0;
	scanf("%d", &n);
	std::string s = "123456789";
	const char *str = s.c_str();
	do{
		for(int i =1; i<=7; ++i){
			int inta = parse(str, 0, i);
			if(inta >= n)break;
			for(int j=1;j<=9-i-1;++j){
				int intb = parse(str, i, j);
				int intc = parse(str, i+j,9-i-j);
				if((intb%intc==0)&&(inta+intb/intc==n))ans++;
			}
		}
		
	}while(std::next_permutation(s.begin(),s.end()));
	cout<<ans;
}


  1. 区间[L,R]内使arr[L]到arr[R]排序后连续
#include<iostream>
using namespace std;
int n;
int arr[50000];
int main(int argc, const char *argv[]){
	int ans=0;
	scanf("%d", &n);
	for(int i=0;i<n;i++){
		scanf("%d", &arr[i]);
	}
	for(int j=0;j<n;j++){
		int min = arr[j];
		int max =arr[j];
		for(int i=j;i<=n-1;i++){
			if(i==j)ans++;
			else{
				if(arr[i]>max)max=arr[i];
				if(arr[i]<min)min=arr[i];
				if(max-min+1==i-j+1)ans++;
			}
		}
	}
	cout<<ans;
	return 0;
}
  1. 大数加法
string add(string a,string b){
	a = a.substr(a.find_first_not_of("0"));
	b = b.substr(b.find_first_not_of("0"));
	long long lenA=a.length();
	long long lenB=b.length();
	long long len=max(lenA,lenB)+10;
	string ans(len,'0');
	reverse(a.begin(),a.end());
	reverse(b.begin(),b.end());
	for(int i=0;i < lenA; i++){
		ans[i]=a[i];
	}
	int tmp=0;
	for(int i = 0; i < len; i++){
		if(i<b.length()){
			tmp+=((ans[i]-'0')+(b[i]-'0'));
		}
		else{
			tmp+=ans[i]-'0';
		}
		ans[i]=tmp%10+'0';
		tmp/=10;
	}
	reverse(ans.begin(),ans.end());
	return ans.substr(ans.find_first_not_of("0"));
}

4.模拟除法

 for(int i=0;i<100;i++)
    {
        a[i]=b/c;
        b=(b%c)*10;
        cout<<a[i];
    }
  1. 辗转相除,枚举
#include <iostream>
using namespace std;

int gcd(int a,int b){
	if(b==0)return a;
	gcd(b, a%b);
} 
int main()
{
	int ans=0; 
	for(int a=1;a<=9;a++){
		for(int b=1;b<10;b++){
			for(int c=1;c<10;c++){
				for(int d=1;d<10;d++){
					if(a!=b&&c!=d){
						if(a*c/gcd(a*c,b*d)==(a*10+c)/gcd(a*10+c,b*10+d)&&b*d/gcd(a*c,b*d)==(b*10+d)/gcd(a*10+c,b*10+d)){
							ans++; 
						}
					}
				}
			}
		}
	}
	cout<<ans;
}
  1. 迭代
#include <iostream>
using namespace std;

int ans=0;
void diedai(int jiu,int dian, int hua){
	if(dian==5&&hua==9&&jiu ==1)ans++;
	if(dian<5)diedai(jiu*2,dian+1,hua);
	if(hua<9)diedai(jiu-1,dian,hua+1);
	return;
}
 
int main()
{
diedai(2,0,0);
cout<<ans;
}

7.全排列+vector类模板的push_back,塞入vector最后

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;

void check(vector<int> v);
int main()
{
	vector<int> v;
	v.push_back(2);
	for(int i=4;i<=7;i++){
		v.push_back(i); 
	}	
	for(int i=9;i<=12;i++){
		v.push_back(i); 
	}	
	do{
		check(v);
	}
	while(next_permutation(v.begin(),v.end()));
}
void check(vector<int> v){
	int r1 = 1+v[0]+v[3]+v[5];
	int r2 = 1+v[1]+v[4]+v[8];
	int r3 = 8+v[0]+v[1]+v[2];
	int r4 = 11+v[3]+v[6];
	int r5 = 3+v[2]+v[4]+v[7];
	int r6 = v[5]+v[6]+v[7]+v[8];
	if(r1==r2&&r2==r3&&r3==r4&&r4==r5&&r5==r6){
		for(int i=0;i<=8;i++){
			cout<<v[i]<<" ";
		}
	}
}
 
  1. 蚂蚁感冒
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;

void check(vector<int> v);
int main()
{
 	int n;
 	scanf("%d", &n);
 	int arr[n];
 	for(int i=0;i<n;i++){
 		scanf("%d",&arr[i]);	
	}
	int x = arr[0];
	int ans=1;
	if(x>0){
		for(int i =0;i<n;i++){
			if(arr[i]<0&&-arr[i]>x){
				ans++;
			}
		}
		if(ans!=1){
			for(int i=0;i<n;i++){
				if(arr[i]>0&&arr[i]<x){
					ans++;
				}
			}
		}
	}
	if(x<0){
		for(int i =0;i<n;i++){
			if(arr[i]>0&&arr[i]<-x){
				ans++;
			}
		}
		if(ans!=1){
			for(int i=0;i<n;i++){
				if(arr[i]<0&&-arr[i]>-x){
					ans++;
				}
			}
		}
	}
	cout<<ans;
	
}

  1. dfs迷宫问题
#include <iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
int n, m, k;
int data[50][50];
long long ans;
const int MOD = 1000000007;

void dfs2(int x,int y,int max,int cnt){
	if(x==n||y==m||cnt>k) 
		return;
	int cur =data[x][y];
	if(x==n-1&&y==m-1){
		if(cnt==k||(cnt==k-1&&cur>max)){
			ans++;
			if(ans>MOD)
				ans%=MOD;
		}
	}

	if(cur>max){
		dfs2(x,y+1,cur,cnt+1);
		dfs2(x+1,y,cur,cnt+1);
	}
	dfs2(x,y+1,max,cnt);
	dfs2(x+1,y,max,cnt);

}
int main()
{
	scanf("%d %d %d", &n,&m,&k);
	for(int i =0;i<n;i++){
		for(int j=0;j<n;j++){
			scanf("%d", &data[i][j]);
		}
	}
	dfs2(0,0,-1,0);
	cout<<ans;
	return 0;
	
}

  1. 求最大公约数,最大公倍数
#include <iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;

int gcd(int a,int b){
	if(b==0)return a;
	gcd(b,a%b);	
	
} 

int main()
{
	int a,b,c;
	cin>>a>>b>>c;
	int ab = a*b/gcd(a,b);
	int ans = ab*c/gcd(ab,c);
	cout<<ans;
	
}

  1. 插入排序
void charu(int a[],int n){
	int j;
	for(int i=0;i<n;i++){
		int tmp = a[i];
		for(j=i-1;j>=0&&a[j]>tmp;j--){
			a[j+1]=a[j];
		}
		a[j+1]=tmp;
	}
}
  1. 十六进制转为十进制
int main()
{
 int n;
 cin>>n;
 string a[15];
 for(int i=0;i<n;i++){
  cin>>a[i];
 }
  for(int i=0;i<n;i++){
   int sum;
   for(int j=0;j<a[i].length();j++){
    if(a[i][j]>='A'&&a[i][j]<='F'){
        sum = sum*16+a[i][j]-'A'+10;
      }   
       else{
        sum = sum*16+a[i][j]-'0';
       }   
   }
   
   int b[100000];
   int p=0;
   int num=0;
   while(sum!=0){
    b[p++] = sum%8;
    sum=sum/8;
    num++;
   }
   for(int i=num-1;i>=0;i--){
    if(b[i]==0)continue;
    cout<<b[i];
   }
   cout<<endl; 
  }
 return 0; 
}
  1. 递归回溯全排列]
void f(int x[], int k){
 int i,t;
 if(k>=9){
  test(x);
  return ;
 }
 for(i=k;i<9;i++){
  {t=x[k],x[k]=x[i];x[i]=t};
  f(x,k+1);
  {t=x[k],x[k]=x[i];x[i]=t}; 
 }
} 

  1. stl之map的使用

在这里插入图片描述

  1. stl之set的使用在这里插入图片描述
  2. stl之vecror的使用

在这里插入图片描述

  1. 十进制转化为任意进制
string ten2other(int n, int radix){ //是待转十进制数,radix是制定的进制 
 string ans = "";
 do{
  int t=n%radix;
  if(t>=0&&t<=9)ans+=t+'0';
  else ans+=t-10+'A';
  n/=radix;
 }while(n!=0);
 reverse(ans.begin(),ans.end());
 return ans;
}
  1. 任意进制转化为十进制
int other2ten(string n, int radix){ //n是给定的radix进制的字符串 
 int ans;
 for(int i=0;i<n.size();i++){
  char t = n[i];
  if(t>='0'&&t<='9')ans=ans*radix+t-'0';
  else ans=ans*radix+t-'A'+10; 
 }
 return ans;
}
  1. int转化为string
void i2s(int num,string &pai){
 stringstream ss;
 ss<<num;
 ss>>str
}
  1. 快速幂
//递归
long long pow1(int a,int b){
    if(b==0)
        return 1;
    if(b&1){
        return a*pow(a,b-1);
    }else{
        long long mul;
        mul=pow(a,b/2);
        return mul*mul;
    }
}
//循环
long long pow2(int base, int exp)
{
    long long result = 1;
    while(1){
        if (exp & 1)
            result *= base;
        exp >>= 1;
        if (!exp)
            break;
        base *= base;
    }
    return result;
}

int poww(int a, int b) {
    int ans = 1, base = a;
    while (b != 0) {
        if (b & 1 != 0)
            ans *= base;
            base *= base;
            b >>= 1;
    }
    return ans;
}

在这里插入图片描述
链表的使用list:
1.push_back()
2.begin()
3.erase()
4.insert()

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#include<queue>
#include<functional>
#include<list>
int main() {
	int n, m;
	cin >> n >> m;
	list<int>l;
	for (int i = 0; i < n; i++) {
		l.push_back(i + 1);
	}
	while (m--) {
		int a, b;
		cin >> a >> b;
		list<int>::iterator i = l.begin();
		while (*i != a) {
			i++;
		}
		i = l.erase(i);
		while (b < 0) {
			i--;
			b++;
		}
		while (b > 0) {
			i++;
			b--;
		}
		l.insert(i, a);
	}
	for (list<int>::iterator i = l.begin(); i != l.end(); i++) {
		cout << *i;
	}
	return 0;
}

vertor:

  1. size()
  2. push_back()
  3. begin()
  4. end()
  5. vectorv(10) 10个元素
  6. resize()
    set:元素各不相同
  • sets
  • insert()
  • begin()
  • end()
  • find()
    map:
  • map<string ,int>m
  • begin()
  • end()
  • size()
  • m[“sss”]=2
    stack:
  • stacks
  • top()
  • size()
  • push()
  • pop()
    queue:
  • push()
  • pop()
  • front()
  • back()
  • size()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值