#include
#include
//#include
//#include
using namespace std;
string s="string";
char a[20]={"char[]"};
int main(){
//1、字符串拼接
//支持使用 + 连接字符串
//2、字符串输入输出
//cin >> s; //输入Hello World! cin是以空格,回车作为结束输入的标志
//cout<< s <
//3、读取一行字符(cin.getline())
//cin.getline定义在下,如:a[n] 则最多读取 n-1个字符
//cin.getline(a,8);
//4、获取字符串的长度
//size() , length()
//5、可以把字符串当成字符数组使用
//6、字符串与字符数组的互换,C-风格的字符数组可以与字符串互相转换
//字符串转字符数组
//内置函数 copy
//int lens = s.copy(a,s.size());
//a[lens] = '\0';
//strcpy 函数
//strcpy(a,s.c_str());//头文件使用 cstring
//字符数组转字符串
//string s(a);
//7、字符串的比较 ,数组用strcmp(),相等为0,不等为1 (或者循环遍历)
//8、字符串的子串(截取字符串) substr()
//cout<
//9、查找字符串的子串 find()
//cout<
//cout<
//10、替换字符串 replace(起始位置,个数,"替换内容")
//s.replace(3,1,"XI");// 输出 strXI
//指定替换
//int n=s.find("t");
//s.replace(n,3,"HUA");// 输出 sHUAIng
//11、删除子串
//s.erase(position,nummer); //起始位置,删除个数
//12、添加子串
//s.insert(5,"aaa");//5表示位置 "aaa"表示增加的字符串 ,输出 strinaaag
//13、reverse 反转函数
//reverse(s.begin(),s.end());// 使用头文件
//14、sort 排序
//sort(s.begin(),s.end());// 使用头文件
return 0;
}
#include
#include
using namespace std;
bool cmp(int x,int y){
return x < y;
}
struct Student{
string name;
int score;
Student() {}
Student(string n,int s):name(n),score(s) {}
};
bool cmp_score(Student x,Student y){
return x.score>y.score;
}
int main(){
//自定义排序
//1、对整型数组的排序
int num[5] = {1,2,3,5,4};
sort(num,num+5,cmp);
for(int i=0;i<5;i++){
cout<<num[i]<<" ";
}
//2、对结构体排序
Student stu[3];
stu[0]=Student("小希",100);
stu[1]=Student("小乐",88);
stu[2]=Student("小明",95);
sort(stu,stu+3,cmp_score);
cout<<endl;
for(int i=0;i<3;i++){
cout<<stu[i].name<<" "<<stu[i].score<<endl;
}
return 0;
}
#include
#include
#include
#define pb push_back
using namespace std;
int main() {
vector<int> v;
int n;
cin >> n;
while (n--) {
int num;
cin >> num;
v.pb(num);
}
auto minv = min_element(v.begin(), v.end());
auto maxv = max_element(v.begin(), v.end());
cout << *minv << " " << *maxv;
return 0;
}
C++的头文件algorithm中有用于二分查找的函数,分别为lower_bound()
、upper_bound()
以及binary_search()
:
使用这些函数的前提是数组必须是有序的(升/降)。
lower_bound()
:返回大于或等于目标值的第一个位置
upper_bound()
:返回大于目标值的第一个位置
binary_search()
:若目标值存在则返回true,否则返回false
这三个函数都有三个参数:分别为数组的起始位置、数组的终止位置(取不到)以及要查找的目标值,返回值为物理地址,因此要获得对应的逻辑地址,需要减去数组的起始位置。
#include
#include
using namespace std;
int a[8] = {1, 2, 4, 4, 5, 8, 10, 22};
int main(){
int x = lower_bound(a, a + 8, 4)-a;
int y = upper_bound(a, a + 8, 4)-a;
bool z = binary_search(a, a + 8, 4);
cout<<x<<" "<<y<<" "<<z<<endl; //输出 2 4 1
return 0;
}
核心思想:不断缩小搜索区域,降低查找目标元素的难度
以在升序序列中查找目标元素为例,二分查找算法的实现思路是:
#include
#include
#include
using namespace std;
void mytolower(char *s){
int len=strlen(s);
for(int i=0;i<len;i++){
if(s[i]>='A'&&s[i]<='Z'){
s[i]=tolower(s[i]);
//s[i]+=32;//+32转换为小写
//s[i]=s[i]-'A'+'a';
}
}
}
void mytoupper(char *s){
int len=strlen(s);
for(int i=0;i<len;i++){
if(s[i]>='a'&&s[i]<='z'){
s[i]=toupper(s[i]);
//s[i]-=32;//+32转换为小写
//s[i]=s[i]-'a'+'A';
}
}
}
int main() {
cout<<"请输入一个含大写的字符串:";
char s[201];
gets(s);
mytolower(s);
cout<<"转化为小写后为:"<<s<<endl;
mytoupper(s);
cout<<"转化为大写后为:"<<s<<endl;
return 0;
}
#include
#include
using namespace std;
int main()
{
int num[3]={1,2,3};
do{
cout<<num[0]<<" "<<num[1]<<" "<<num[2]<<endl;
}while(next_permutation(num,num+3));
/* 输出:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
*/
return 0;
}
动态规划(Dynamic Programming,简称 DP)是一种求解决策过程中的最优化问题的方法,它的核心思想是将大问题分解为小问题进行求解,再从这些小问题的答案构建大问题的答案。
动态规划的基本思路:
动态规划的关键要素:
动态规划的步骤:
动态规划与递归和分治的区别:
贪心算法是算法设计中的一种方法,它在每一步选择中都采取在当前看来最好的选择,也就是局部最优选择,以希望这样的选择能导致全局最优解。
贪心算法的特点:
贪心算法的基本结构:
从问题的某一初始解出发。采用循环结构,当可以向求解目标前进一步时:
选择当前状态下的最佳选择。更新当前状态,通常是向前一步。
直到达到问题的一个解为止。
贪心算法与动态规划的区别:
虽然贪心算法不能保证总是得到整体最优解,但由于其高效性,它在很多情况下仍然是一个非常有用的方法。当然,确定一个问题是否适合使用贪心策略是非常关键的。