感觉其实(大部分)算法挺难的,这里准备先搞一下各函数c++的替换版本,毕竟不可能一场比赛又用c++又用java
数字与字符串互转也要整理一下
目录
1.字典序排列
升序 next_permutation(a,a+n) ; ……字符数组
降序 prev_permutation(a.begin(),a.end()); ……string类
没想到其实这里就已经接触到迭代器(a.begin())了,不过理解成指针也没什么问题
ps:本文函数区间都是左闭右开区间
头文件:#include<algorithm>
返回值:true/false//不是很理解为什么要这样返回
补充: 对于next_permutation(a,a+n) ;该函数是寻找该范围内数组组合下一个大一点的字典数
如果还有满足条件的组合 就返回true 否则则返回false
2.连续子串查找
a.find([b[i]]) 返回b[i]在a数组中的下标
a.find(b) 在string a 中寻找 string b
头文件:#include<string>
返回值:string::npos (失败) or b[i]在a数组中的下标(成功)
记住这个:
string::npos //失败的条件
3.string 类用 strcmp系列
string类转成字符数组类//这个不怎么用就没记,不记得了来查查
strcmp(a.c_str(),b.c_str());
加上c_str()就好了
4.sort排序
sort(a,a+n) //升序 head: #include<algorithm>
sort(a,a+n,greater<int>()) //降序 head:#include<functional>
5.c++数位操作
这一部分比较基础而且重要,单独写一篇
6.java进制转换,刚刚看到的补充一下
(Integer.toXXXString(待转换十进制数,转换后进制)
String s = Integer.toString(1000,8);//将1000转成八进制
10转2 Binary
如:
String s = Integer.toBinaryString(1000);//将1000转成2进制
下同
10转8 Octal
10转16 Hex
10转x 上面的方法
x进制字符串s转10进制
//String s = "10101";
//
//System.out.println(Integer.parseInt(s,x));
//
附上链接:
里面的评论还是很有用的
7 c++二分函数
测试代码
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<stack>
#include<algorithm>
#include<string>
using namespace std;
typedef unsigned long long ull;
const ull MOD=0x3f3f3f3f3f;
const double PI=3.1415926;
int a[100000];
int b[100];
//string a,b;
int main()
{
while(1)
{
int n;
cout<<"请输入"<<endl;
cin>>n;
if(n==0)
break;
int i,j,k;
for(i=0; i<n; i++)
cin>>a[i];
sort(a,a+n);
for(i=0; i<n; i++)
cout<<a[i]<<" ";
cout<<endl<<"输入查找数字"<<endl;
int findit;
cin>>findit;
cout<<"贰分查找"<<binary_search(a,a+n,findit)<<endl;
cout<<"大于等于查找"<<lower_bound(a,a+n,findit)-&a[0]+1<<endl;
cout<<"大于查找"<<upper_bound(a,a+n,findit)-&a[0]+1<<endl;
cout<<"请选择"<<endl;
//cin>>n;
}
return 0;
}
binary_search 返回真假 只能判断是否存在
下面两个返回指针
通常减去首地址后+1得到目标数下标
lower_bound 名字很奇怪 不过理解为不小于函数 还是很容易记下的
upper_bound 就是寻找大于传入值函数
8.c++输入
这里分为字符数组类和string类
两个相似的字符数组类输入函数(都支持录入空格)
1.
char a;
char str[100];
cin.get(a);
cin.get(str,20,'a');//字符数组名称 最多接受个数 结束字符(不录入)
2.
cin.getline(str,20,'a');//字符数组名称 最多接受个数 结束字符(不录入)
//和上面一样 不知道为什么会有两个这么相似的
一个支持string类的输入函数
string str;
getline(cin,str,'a');//cin 字符数组名称 结束字符(不录入)
9.反转函数reverse
对string 和char s[100010]都有用
但是返回值不是一个数组或string字符串 这个函数也只是一个操作函数
所以诸如
a=reverse(a.begin(),a.end());
这种写法是错的 因为类型不匹配
正确代码
int main()
{
string a;
cin>>a;
reverse(a.begin(),a.end());
cout<<a<<endl;
return 0;
}
The End.封装的函数
自己积累的一些封装函数,与上文编译器封装的做区别
1.最大公因数/最小公倍数
#include<cstdio>
#include<iostream>
using namespace std;
int gcd(int x,int y)//xy比ab好记一些
{
return y==0?x:gcd(y,x%y);
}
int main()
{
cout<<"请输入两个数"<<endl;
int m,n;
cin>>m>>n;
//不用管 ab哪个大就是爽
cout<<gcd(m,n);
return 0;
}
//最大公倍数用m*n除以此结果即可
2.快速幂/快速乘(原理是模拟二进制计算)//这次不会再忘了
int pow_plus(int a,int b)//快速乘
{
int ans = 0;
while(b)
{
//cout<<"每轮打印"<<endl;
//cout<<a<<" "<<b<<" "<<ans<<endl;
if(b & 1 )//如果b是偶数
{
ans += a;
}
a += a;
b >>= 1;
}
return ans;
}
int time_plus(int a,int b)//快速幂
{
int ans = 1;
cout<<a<<" "<<b<<endl;
while(b)
{
if(b & 1 )//如果b是偶数
{
ans *= a;
}
a *= a;
b >>= 1;
}
return ans;
}
原理一致,代码出奇的一致
幂的初值为1
乘的初值为0(加法模拟计算)