【牛客题霸】语法篇 - C++入门72题
数字和基本语法
一些笔记:cin
注意,用户在输入数字时要用空格分隔数字。 这样 cin 才能知道每个数字的开始和结束位置。 在每个数字之间输入多少空格并不重要,需要注意的是,在最后一个数字输入之后,必须按回车键。
cpp2. double小数转int整数,四舍五入
double a;
int b = a;
会直接输出a的整数部分。
考点:负数;小数点后没有数字
方法一:round函数
四舍五入到最邻近的整数
需要额外 #include<math.h>
#include<math.h>
round(1.56)=2.000000
round(-1.99)=-2.000000
方法二:直接写
double x;
int y;
if(d>=0) y = d+0.5;else y = d- 0.5;
cout << y <<endl;
cpp7. 三元表达式
#include <iostream>
using namespace std;int main() {int a, b, c;cin >> a;cin >> b;cin >> c;// write your code here......(a>=b&&a>=c? (cout<<a):(b>=a&&b>=c? cout<<b : cout<<c));cout<<endl;return 0;
}
cpp8. 取小数点后1位
setprecision()为了精确小数位数
setiosflags(ios::fixed)为了保证当只有一位小数位且该小数位是0时,避免用e的指数输出
cout << setiosflags(ios::fixed) << setprecision(1) << cost << endl;
取小数点后1位 :
printf("%.2lf\n",sum);
输出两个数,中间隔空格:
cout<<fixed<<setprecision(1)<< AA <<" "<<setprecision(1)<< BB <<endl;
cpp10-11. switch
题目:
判断成绩等级(不要忘记在 case 语句的结尾添加 break 语句)
判断季节(闭区间:** … 左右必须加空格**)
default可以处理12、1、2这样不好分类的case,但可能与switch之前的不合法判断重复!因此,不合法判断写作if,switch写在else中较好!或者如下,提前return:
cin >> score;if(score > 12 || score < 0){cout<<"不合法"<<endl;return 0;}switch(score / 10){ case 10: case 9: //可以一起取两种情况cout << "优秀" << endl; break;case 3 ... 5: //连续的值cout << "春季" << endl; break;default: //其余情况cout << "差" << endl;
cpp12.for循环の跳步:
for(int i = n; i >0; i-=2)
cpp14.水仙花数:获取个十百位数字的方法 + main以外的bool函数
#include <iostream>
using namespace std;
bool isNarcissus(int num){// bool flag;//不需要flag,直接return即可!// int a = num/100;//百位// int b = (num%100)/10;//十位//以下是另一种方法,更通用but需要先用tmp保存初始num值int tmp = num;int c = num%10;//个位num /= 10;int b = num % 10; //十位num /= 10;int a = num % 10; //百位if ((a*a*a + b*b*b + c*c*c)==tmp){// flag= true;return true;}else return false;//flag = false;// return flag;
}
int main(){for(int i = 100; i <=999; i++){if (isNarcissus(i)) cout<<i<<endl;}return 0;
}
cpp16. long long的应用
求9 + 99 + … + 9999999999(10个9) 的和
如果用int会溢出。
#include <iostream>
using namespace std;
int main(){long long sum = 0;long long j = 0;for(int i = 0; i<10; i++){j = j*10 + 9;sum += j;
}cout<<sum<<endl;return 0;
}
cpp17 如何输出“100.0 50.0”
cout<<fixed<<setprecision(1)<< sum <<" "<<setprecision(1)<< x/2 <<endl;
double一般就用来表示小数;
cin 可以连续从键盘读取想要的数据,以空格、tab 或换行作为分隔符,所以输入100 3就等同于输入了100、输入了3(空格分隔)
https://blog.csdn.net/Buster001/article/details/100083803后续去看!
数组
cpp19. 获取数组最大最小值
自己思路:预定max为整数下限INT_MIN,min为整数上限INT_MAX
实际上可以将其都预定为 arr[0],这样输出的总为数组中的实际值;
int数组初始化为空:int arr[6] = {};初始化为0:int arr[6] = { 0 }
#include <iostream>
using namespace std;
int main(){int arr[6] = {};int max = 0;int min = 99999;for(int i = 0; i < 6; i++){cin>>arr[i];if(arr[i] > max) max = arr[i];if(arr[i] < min) min = arr[i];}cout<<min<<" "<<max<<endl;return 0;
}
int数组创建+输入+求元素个数
int arr[6] = { 0 };int len = sizeof(arr) / sizeof(int); // 24/4=6for (int i = 0; i < len; i++) {cin >> arr[i];}
另外:
char 数组里面是一个1 个元素1 个字节
int 和 long 数组里面在32位环境中都是1 个元素 4 个字节
long long 数组里面是1 个元素 8个字节:
#include<iostream>
using namespace std;
int main()
{char arr1[10]; // 10int arr2[10]; // 40long arr3[10]; // 40long long arr4[10]; // 80cout << sizeof(arr1) << endl << sizeof(arr2) << endl << sizeof(arr3)<<endl<<sizeof(arr4);return 0;
}
cpp21.冒泡排序
输入一个6元素的数组,进行冒泡排序
(未知个数,则使用:
int arr[9999] = { 0 };int len = sizeof(arr) / sizeof(int);for (int i = 0; i < len; i++) { ...
重点在于 for(int i = 0; i <5 ; i++) (01234)和 for( int j = 0; j<5-i; j++)(01234,0123,012,01,0)的含义和上限:
i 表示遍历的轮数,总共需要len-1轮;实际上只是用来计数的,用12345、54321也一样,不参与实际操作(swap)
j 表示每次遍历相邻的j和j+1两个元素
i 和 j 的关系是和为 len-1,因为第一轮需要遍历到倒数第二和第一个元素,最后一轮只比较第一二个元素。
另外,标准库也可以使用swap(arr[j], arr[j + 1]) !
#include<iostream>
using namespace std;
int main(){int arr[6]= {0};for(int i = 0; i<6;i++){cin>>arr[i];}for(int i = 0; i <5 ; i++){for( int j = 0; j<5-i; j++){if(arr[j]>arr[j+1]){int tmp = arr[j];arr[j] = arr[j+1];arr[j+1]= tmp;}}}for(int i = 0; i<6;i++){cout<<arr[i]<<" ";}cout<<endl;return 0;
}
复杂度分析:
时间复杂度:O(n2),n为数组长度,冒泡排序两层循环,最坏情况下是逆序,一共比较(n∗(n−1)/2)次
空间复杂度:O(1),无额外空间
cpp22.选择排序
以下的注释行,死记住……不能改任何一处
#include <iostream>
using namespace std;int main() {int arr[6] = {0};int len = sizeof(arr) / sizeof(int);for(int i = 0; i < len; i++) cin>>arr[i];for(int i = 0; i <len-1 ; i++){int min = i;/for(int j = i+1; j < len; j++){if(arr[j] < arr[min]) min = j;/}swap(arr[i], arr[min]);/交换两个变量的内容}for(int i = 0; i < len; i++) cout<<arr[i]<<" ";cout<<endl;return 0;
}
复杂度分析:
时间复杂度:O(n2),一共n轮选择,每轮要比较O(n)次
空间复杂度:O(1),无额外空间
cpp23. 创建二维int数组
int arr[4][3] = {22,66,44, //有逗号,然后换行即可77,33,88,25,45,65,11,66,99 //没有逗号};
cpp29. 创建动态数组(※再看)
为什么网上都说要用 arr = (int*)malloc( arrLen*sizeof(int) );
int* arr = new int[n];
解析用的是
int* arr = new int[n];
之后一切如常。。。
#include <iostream>
using namespace std;
int main() {int n;cin >> n;int* arr = new int[n]; //指针申请n个空间for(int i = 0; i < n; i++) //初始化arr[i] = n + i;for(int i = 0; i < n; i++) //输出cout << arr[i] << " ";return 0;
}
cpp26. 指针遍历 int 数组+输出
类似指路:cpp28指针处理char数组+输出
#include<iostream>
using namespace std;
int main(){int arr[6] = {0};int len = sizeof(arr)/sizeof(int);for(int i = 0; i < len ; i++) cin>>arr[i];int* p = arr;while(*p != '\0'){///for (ptr ; ptr < arr + len ; ptr++)cout<< *p <<" ";p++;}cout<<endl;return 0;
}
创建二维数组
没用过,直接创建在牛客里好像也不是不行。。。下面的用法看看
cin>>n;int** a = new int*[n];for (int i = 0; i < n; i++) {a[i] = new int[n];for (int j = 0; j < n; j++) {...
cpp30.数组元素处理
语法要点:
void func(int* p, int n) int p1[n] = {0};会报错!
i++是先用i的值,语句执行完,i再++
主要思路:
双指针
自己的思路:
#include <iostream>
using namespace std;void func(int* p, int n);int main() {int arr[6] = { 0 };for (int i = 0; i < 6; i++) {cin >> arr[i];}func(arr, 6);for (int i = 0; i < 6; i++) {if (i == 5) {cout << arr[i] << endl;}else {cout << arr[i] << " ";}}return 0;
}
void func(int* p, int n) {// write your code here......///int p1[n] = {0};会报错!int count = 0;for (int i = 0, j = 0; i<n; i++){ if (p[i] != 0 ){//p1[j] = p[i];p[j] = p[i];j++;}else count++;}while(count != 0) {//exp: count = 1, n = 6 ,p[5] = 0p[n-count] = 0;count--;}
}
答案的思路:
void func(int* p, int n) {//id指向第一个0所在位置int id=0;//i指向游标所在位置,遍历数组所有元素for(int i=0;i<n;i++){if(p[i]!=0){int temp=p[i];p[i]=p[id];p[id++]=temp;}}
}
cpp61. 数组类的构造函数
又是一道没用过只能先粘贴过来的题。。。
#include<bits/stdc++.h>
using namespace std;
class Array{private:int n;//数组大小 int *a;//数组 public:// write your code here.....Array(){cin>>n;a = new int[n];for(int i = 0;i<n;i++)cin>>a[i];}~Array(){delete []a;}void show(){for (int i=0;i<n;i++) cout<<a[i]<<' ';}
};
int main(){Array a;a.show();return 0;
}
cpp72. 找到数组里的第k大数(C++)
vector的初始化和加入值
vector<int>a;a.push_back(num);
字符串
字符串介绍:
https://www.nowcoder.com/knowledge/intro-index?kcid=95
字符串是存储在内存连续字节中的一系列字符。C++ 处理字符串有两种方式,一种是 C-风格字符串,另一种是基于 string 类。
C-风格字符串
可以将字符串存储在 char 数组中,每个字符都位于自己的数组元素中。
char name[5] = {'K', 'i', 't', 't', 'y'}; // 字符数组,不是字符串
C-风格字符串是以空字符结尾(空字符被写作\0,ASCII码为0),用来标记字符串的结尾。
char name[6] = {'K', 'i', 't', 't', 'y', '\0'}; // C-风格字符串
字符数组初始化为字符串,可以使用双引号(“”)将字符串内容括起来。
char name[16] = "Hello Kitty";
char name[] = "Daniel";
// 双引号括起来的部分称之为字符串常量或者字符串字面值
string 类
可以使用 string 类型的变量来存储字符串。提供了将字符串作为一种数据类型的表示方法,使用起来比数组简单。
要使用 string 类,必须包含头文件**#include< string >**
string 初始化:
string str = {'h', 'e', 'l', 'l', 'o'};
string str = "hello world";
string str = {"hello world"}
string str {"hello world"}
显著区别:
① 可以将一个 string 对象赋值给另一个 string 对象,而数组不可以。
string str1;
string str2 = "hello";
str1 = str2;
② 可以使用运算符 + 将两个 string 对象合并起来,还可以使用 += 运算符。
string str3 = str1 + str2;
str1 += str2;
③ string对象用size()和length()方法获取字符串长度。
cpp24.string输入+合并+输出
输出两个字符串拼接后的结果
输入:
hello
nihao
复制
输出:
hellonihao
#include <iostream>
#include <string> ///!
using namespace std;
int main() {string s1, s2;getline(cin, s1);getline(cin, s2);s1 = s1+s2;cout<<s1<<endl;return 0;
}
cpp56.string输入+统计其中某些char的个数
题目描述:输入一个只包含’a’,‘b’,‘c’的字符串,问’a’,‘b’,'c’分别出现了多少次。
getline(cin, s) 可以包含空格,可以输入ab c这样的字符串。
sizeof(s) / sizeof(string) 值为1,不能这样获取字符串长度,应该用s.size()或者s.length()。
s[i] 是单引号的 ‘a’ 。
#include<bits/stdc++.h>
using namespace std;
int main(){string s;getline(cin, s);// write your code here......// int len = sizeof(s) / sizeof(string);cout<<len<<endl;//len = 1int aa = 0, bb=0, cc=0;for(int i = 0; i<s.size(); i++){if(s[i]=='a')aa++;else if(s[i]=='b')bb++;else if(s[i]=='c')cc++;}cout<<aa<<" "<<bb<<" "<<cc<<" "<<endl;return 0;
}
cpp34(类似) 统计空格、数字、字母等
#include <iostream>
#include <string>using namespace std;int main() {string str;getline(cin, str);int whitespace = 0;int digits = 0;int chars = 0;int others = 0;// write your code here......for(int i = 0; i < str.length(); i++){ //遍历字符串if(isalpha(str[i])) //判断是否是字母chars++;else if(isdigit(str[i])) //判断是否是数字digits++; else if(isspace(str[i])) //判断是否是空格whitespace++;elseothers++;}cout << "chars : " << chars<< " whitespace : " << whitespace<< " digits : " << digits<< " others : " << others << endl;return 0;}
cpp27. char ch[100] :初始化、输入、输出;指针法求长度
初始化:char ch [100] = { 0 };
输入:cin . getline ( str , sizeof ( ch ) ); 包含空格
输出:cout << str << endl; 直接输出
思路:
求长度,便捷是用 char 数组,而不是string;
但此时对char 数组,不可以用 int len = sizeof(ch) / sizeof(char),会直达9999(数组的真正长度)
正解如下:(指针法)
#include <iostream>
#include <string>
using namespace std;int main() {char ch[9999] = {0};cin.getline(ch,sizeof(ch));//int len = sizeof(ch) / sizeof(char);///不可以用这句,会直达9999(数组的真正长度)char* p = ch;int i = 0;while(*p != '\0'){i++;p++;}cout<<i<<endl;return 0;
}
cpp28. 指针法,创建新 char 数组+输出
题目描述:
在 char ch[100] 原字符串后半段,创建新字符串:指针做法
判断字符数组结束的标志:
for(int i = 0; ch [ i ] ! = ’ \ 0 ’ ; i++)
或者
while (*p != ‘\0’) ,注意是反斜杠0
或者
for (ptr ; ptr < arr + len ; ptr++)
求字符数组长度:
与 int 数组类似,可用 int len = sizeof (ch) / sizeof (char)
指针:
char* p = ch 指向 char数组的起始处,+ m - 1 指向第 m 个元素;
*p 表示 p 所指向的值
#include <iostream>
#include <string>
using namespace std;
int main(){char ch[30]={0};char copych[30]={0};cin.getline(ch, sizeof(ch));/int m;cin>>m;char* p = ch + m - 1;//char* q = copych;for(int i = 0; ch[i]!='\0'; i++){///while(*p != '\0') //判断字符数组结束的标志*q = *p;/复制值q++;/同时移动p++;}cout<<copych<<endl;
}
不用指针的做法:
...
#include <string>//上面的char数组做法,不需要额外这句
int main(){string s;getline(cin,s);int len = s.size();int m;cin>>m;string s1="";for(int i = m-1; i < len; i++){s1+=s[i];}cout<<s1<<endl;return 0;
}
cpp29.char s[100]输入+转化为string+统计子串出现次数-find函数
用find函数
#include <iostream>
#include <cstring>
using namespace std;int main() {char str[100] = { 0 };char substr[100] = { 0 };cin.getline(str, sizeof(str));cin.getline(substr, sizeof(substr));int count = 0;//转化为字符串!!!!!!!!!!!!!!string str1(str);string str2(substr);int i=0;//从str1下标i开始查找str2while(str1.find(str2,i)!=-1){//如果找得到,计数加1count++;//i从找到的位置,后移一位i=str1.find(str2,i)+1;}cout << count << endl;return 0;
}
不用find函数:(用char s[100])
#include <iostream>
#include <cstring>
using namespace std;int main() {char str[100] = { 0 };char substr[100] = { 0 };cin.getline(str, sizeof(str));cin.getline(substr, sizeof(substr));int count = 0;for(int i = 0; str[i] != '\0'; i++){ //遍历字符串strbool flag = true; for(int j = 0; substr[j] != '\0'; j++){ //以字符串str的i位置为起点,每次同步遍历substr长度if(str[i + j] != '\0' && str[i + j] == substr[j]) //比较每个字符continue;else{flag = false; //不相同,这一次不是子串break;}}if(flag)count++;}cout << count << endl;return 0;
}
cpp31. 比较字符串大小:mian以外的函数
比较思路:不等长则长的大;等长则有第一次出现更大字符的大
例如: hello < helloworld hello < Hello
注意点:
函数顺序:先声明,再main函数,再定义
(const char* src, const char* dst)在函数体内直接用,不可以另外初始化
求char数组长度的便捷方法: int len1=strlen(src);
int len1=strlen(src);int len2=strlen(dst);int i=0,j=0;while(i<len1&&j<len2){//如果src当前字符小于dst,说明src小于dst,返回-1if(src[i]<dst[j]) return -1;...
自己的做法:
#include <iostream>
using namespace std;
//先声明,再main函数,再定义
int mystrcmp(const char* src, const char* dst);
int IfLenEqual(const char* src, const char* dst);int main() {char s1[100] = { 0 };char s2[100] = { 0 };cin.getline(s1, sizeof(s1));cin.getline(s2, sizeof(s2));int ret = mystrcmp(s1, s2);cout << ret << endl;return 0;
}
int mystrcmp(const char* src, const char* dst) {int equal = IfLenEqual(src,dst);if(equal == 1) return 1;if(equal == -1) return -1;if(equal == 0){while(*src!='\0' && *dst !='\0'){if(*src > *dst)return 1;if(*src < *dst)return -1;src++;dst++;}return 0;}return 0;
}
int IfLenEqual(const char* src, const char* dst) {int len1 = 0, len2= 0;//char* p = src;///不可以另外初始化// char* q= dst;while(*src != '\0') {len1++;src++;}while(*dst != '\0') {len2++;dst++;}return len1>len2 ? 1 : len1<len2 ? -1 : 0;
}
cpp33. 统计子串出现次数:char转str + 使用find函数
char转str :string str1 ( ch1 );
注意 i是起始位置不是找到位置,所以这样可能会错过或者重复找到目标str
#include <iostream>
#include <cstring>
using namespace std;int main() {char str[100] = { 0 };char substr[100] = { 0 };cin.getline(str, sizeof(str));cin.getline(substr, sizeof(substr));int count = 0;// write your code here......string str1(str);string str2(substr);int i = 0;while(str1.find(str2,i) != -1){///while找到了(第一次必然找到,否则题目不成立)/*i += strlen(substr);//no/(注意 i是起始位置不是找到位置,所以这样可能会错过或者重复找到目标str)cout<<"stri:"<<str[i]<<" ";*/i = str1.find(str2 , i) +1;///从找到的下一位开始 count ++;}cout << count << endl;return 0;
}
cpp34. 统计字符串中各种字符出现次数
string比char数组好用:不用初始化,输入语句短,长度可以直接用length()不用用’\0’判断
#include <iostream>
#include <string>
using namespace std;
int main(){int chars = 0, whitespace = 0, digits = 0, others = 0;string ch;//[999] = {0};//cin.getline(ch , sizeof(ch));getline(cin , ch);//int len = sizeof(ch) / sizeof(char);int len = ch.size();for(int i = 0; i < len ; i++){if(isalpha(ch[i])){chars++;}else if(isdigit(ch[i])){digits++;} else if(isspace(ch[i])){whitespace++;} else others++;}cout<<"chars : "<<chars<<" whitespace : "<<whitespace<<" digits : "<<digits<<" others : "<<others<<endl;return 0;
}
cpp58. 编写【函数】实现字符串翻转(引用方式)
相当于写一个swap函数,其中函数参数用到了引用&
注意两点: length() /2 以及 length()-1 再-i
#include<bits/stdc++.h>
using namespace std;
// write your code here......
void swap( string& s){for(int i = 0; i < s.length()/2; i++){char ch = s[i];s[i] = s[s.length()-i -1 ];s[s.length()-i - 1] = ch;}
}int main(){string s;getline(cin,s);// write your code here......swap(s);cout<<s<<endl;return 0;
}
cpp49. 用set去除字符串中重复的字符
set
是STL的集合容器,相同的元素在set中只保留一次,而且set还会依赖于红黑树自动排序,如果是字符依靠ASCⅡ码的大小排序。
①引入set,需要#include <set>
②创建一个 set :set<char> sett;
注意只有一个参数
③在 set 中给元素赋值:不能直接用 = 赋值,而是要插入元素:sett.insert(str[i]);
④ 遍历 set 中每个元素的内容:
for(auto iter = sett.begin(); iter!= sett.end(); iter++){///set<char>iterator itercout<<*iter;}
复杂度分析:
时间复杂度:O(nlog2n),其中n为字符串长度,一共n个字符,每次插入的代价都是O(log2n)
空间复杂度:O(n),集合的大小最坏为n
#include <iostream>
#include <set>// write your code here......
using namespace std;int main() {char str[100] = { 0 };cin.getline(str, sizeof(str));// write your code here......set<char> sett;for(int i = 0; str[i]!= '\0'; i++){sett.insert(str[i]);}for(auto iter = sett.begin(); iter!= sett.end(); iter++){///set<char>iterator itercout<<*iter;}cout<<endl;return 0;
}
cpp70. 查找 - set :reverse_iterator 容器倒序遍历-upper_bound(x)-berak
使用容器: set
解法一:upper_bound(x)-berak
#include<bits/stdc++.h>
using namespace std;
int main(){set<int>s;//write your code here......int n,m,x,a;cin>>n>>m;for(int i=0;i<n;i++){cin>>a;s.insert(a);//有序存储不重复}while(m--){cin>>x;auto it=s.upper_bound(x);//返回第一个大于x的元素对应的迭代器指针if(it==s.end()) cout<<-1<<endl;else cout<<*it<<endl;}return 0;
}
解法二:输入数量过多时会报错运行超时
#include<bits/stdc++.h>
using namespace std;
int main(){set<int>sett;//write your code here......int n, m;cin>>n>>m;vector<int> a;for(int i = 0; i < n; i++){int ax;cin>>ax;/space// a.push_back(ax);sett.insert(ax);}//for(auto it = sett.begin();it!=sett.end();it++)cout<<*it;///3 5 6 8 while(m){m--;int x;cin>>x;bool f = 0;for(set<int>::iterator iter = sett.begin(); iter != sett.end();iter++){/// NO <=//for(vector<int>::iterator iter=a.end()-1;iter!=a.begin();iter--){//for(set<int>::reverse_iterator iter = sett.rbegin(); iter != sett.rend();++iter){if(*iter > x){// && *(iter+1) >= x//cout<<"x: "<<x<<" iter: "<< *iter <<endl;cout<< *iter <<endl;f = 1;break;}//continue; }if(f == 0) cout<<-1<<endl; ///不需要“-1”}return 0;
}
cpp50. 统计字符串中各字母字符对应的个数-map
map
map 提供的是一种键值对容器,里面的数据都是成对出现的:第一个值称之为关键字(key),只能在 map 中出现一次;第二个称之为该关键字的对应值(value)。
① 引入map,需要#include <map>
②创建一个 map :map<char, int> mapp;
注意有两个参数,并注意顺序(本题计数题,后一个是int用来计数)
③在 map 中给元素赋值:可以直接用等号赋值,但要注意顺序:mapp [ str [ i ] ] = 5
④遍历 set 中每个元素的内容:与 set 类似,但有两个子树,用 iter -> 指向:
for(auto it = mapp.begin(); it != mapp.end(); it++){cout<< it->first <<':'<< it->second <<endl;}
#include <iostream>
// write your code here......
#include <map>
using namespace std;int main() {char str[100] = { 0 };cin.getline(str, sizeof(str));// write your code here......map<char, int> mapp;for(int i = 0; str[i]!='\0'; i++){if(isalpha(str[i])) mapp[str[i]]++;}for(auto it = mapp.begin(); it != mapp.end(); it++){cout<< it->first <<':'<< it->second <<endl;}return 0;
}
cpp71. 查找 - map
#include<bits/stdc++.h>
#include<map>
using namespace std;
int main(){//write your code here......map<int,string>ma;int n,m,x;cin>>n>>m;while(n--){cin>>x;ma.insert(pair<int ,string>(x,"yes"));}while(m--){cin>>x;auto it=ma.find(x);if(it==ma.end()){cout<<"no"<<endl;}else{cout<<"yes"<<endl;}}return 0;
}
自己写的,居然也行
#include<bits/stdc++.h>
using namespace std;
int main(){//write your code here......int n,m;cin>>n>>m;map<int, string> mapp;for(int i = 0; i<n;i++){int x;cin>>x;mapp[x]="yes";}while(m--){int y;cin>>y;if(mapp[y]=="yes")cout<<"yes"<<endl;else cout<<"no"<<endl;}return 0;
}
cpp55. 十进制 int 转十六进制 string
reverse / swap / char / string 插入 + 转int
使用 swap 需要#include <algorithm>
,reverse不用
s = snum + s;
这样就可以把字符 snum 加在字符串 s 前面!!!就不用后续的reverse了!!!
swap 和 reverse 的共同用法:swap(s.begin(), s.end());
reverse(s.begin(), s.end());
swap只交换两个元素,全部反转要用reverse!!!
十进制转其他进制的原理:
注意循环的开头判断是% 处理是/
while(n%16 != 0){...n = n/16;}
整体代码如下:
#include <iostream>
#include <string>
//#include <algorithm> // Needed for swap
using namespace std;string toHexString(int n);int main() {int n;cin >> n;string hexStr = toHexString(n);cout << hexStr << endl;return 0;
}string toHexString(int n) {// write your code here......string s = "";char snum;while(n%16 != 0){int num = n % 16;if (num < 10) {snum = num + '0';//cout<<"0-9 : "<<snum<<endl;}else {num -= 10;snum = 'A' + num;//cout<<">=10 : "<<snum<<endl;}//s += snum;s = snum + s;/这样就可以把字符 snum 加在字符串 s 前面!!!就不用后续的reverse了!!!n = n/16;}//swap(s.begin(), s.end());不可以,swap只交换两个元素,全部反转要用reverse!!!///reverse(s.begin(), s.end());return s;}
面向对象
cpp32. 编写函数,实现swap功能:【指针】或【引用】形式
尤其注意参数 + 内部的表示 + main函数中的调用方式,二者不同!!
另外系统自带swap函数的,所以自己命名为swap即使写错了也不会报错!
#include <iostream>
using namespace std;// write your code here......
void swap1(int *p, int *q);
void swap2(int &a, int &b);int main() {int m, n;cin >> m;cin >> n;swap1(&m,&n); // 指针变量swap2(m,n); //引用变量swap1(&m,&n); // 指针变量 cout << m << " " << n << endl;return 0;
}
void swap1(int *p, int *q)
{int temp = *p;*p = *q;*q = temp;
}
void swap2(int &a, int &b)
{int temp = a;a = b;b = temp;
}
cpp25. 设计【结构体struct】
结构体 struct 和 类 class 都在main外,最后有分号(函数不用分号)
#include <iostream>
#include <string>
using namespace std;struct student{///要提出来,在main外面写string name;int age;double height;///要注意输入范例的height是小数};;int main(){student st;/*string name1;getline(cin , name1);int age1;cin>>age1;int height1;cin>>height1;cout<< name1 <<" "<< age1<<" "<<height1<<endl;*/cin>>st.name >> st.age >> st.height;cout<<st.name<<" "<<st.age<<" "<<st.height<<endl;return 0;
}
cpp38-59-60. 设计【类class】
#include <iostream>
using namespace std;class Cube {private:int length;int width;int height;public://Cube(){}///构造函数---> Cube c; 也可以没有//int setLength(int length){ return length}; WRONG!///function no " ; "!!!!!void setLength(int l){ length = l;}void ----> c.setLength(length);void setWidth(int w){ width = w;}w = width WRONG!!!!void setHeight(int h){ height = h;}int getLength(){return setLength(length)}; WRONG!int getLength(){return length;}///-----> void setLengthint getWidth(){return width;}int getHeight(){return height;}int getArea(){ return 2*(length*width+length*height+width*height);}// 乘法不需要再()int getVolume(){ return getLength() * getWidth() * getHeight();}};int main() {int length, width, height;cin >> length;cin >> width;cin >> height;Cube c;c.setLength(length);c.setWidth(width);c.setHeight(height);cout << c.getLength() << " "<< c.getWidth() << " "<< c.getHeight() << " "<< c.getArea() << " "<< c.getVolume() << endl;return 0;
}
cpp39. 【类】套【类】的运用
题意:判断某点( x1, y1 ) 与圆心( x2 , y2 )半径 r 的圆的位置关系
#include <iostream>
#include <cmath>
using namespace std;// 点类
class Pointer {private:int x; // x 坐标int y; // y 坐标public:void setX(int parameter_x) {this->x = parameter_x;搞清楚顺序:x 由 parameter_x 赋值}int getX() return x;void setY(int parameter_y) {this->y = parameter_y;}int getY() return y;}};// 圆类
class Circle {private:Pointer center; // 圆心int radius; // 半径public:void setCenter(int x, int y) {center.setX(x);///---->Pointer centercenter.setY(y);}void setRadius(int radius) {this->radius = radius;}// write your code here......void isPointerInCircle( Pointer pp){int xx = pp.getX() - center.getX(); |x1 - x2|int yy = pp.getY() - center.getY(); |y1 - y2|int rr = sqrt(xx*xx + yy*yy);不想include<cmath>就把r也平方了if(rr < radius) cout<<"in"<<endl;else if(rr == radius) cout<<"on"<<endl;else cout<<"out"<<endl;}};int main() {// 键盘输入点的坐标int x, y;cin >> x;cin >> y;// 创建一个点Pointer p;p.setX(x);p.setY(y);// 创建一个圆Circle c;c.setCenter(5, 0);c.setRadius(5);// 判断点和圆的关系c.isPointerInCircle(p);return 0;
}
cpp40. 构造函数
重点关注:
构造函数这样创建:
Person (string name1, int age1){//Person pp(string name1, int age1){this->name = name1;this->age = age1;}
构造函数这样调用:
Person p(name, age);
全文:
#include <iostream>
#include <string>
using namespace std;// Person类
class Person {public:string name; // 姓名int age; // 年龄// write your code here......Person (string name1, int age1){//Person pp(string name1, int age1){this->name = name1;this->age = age1;}void showPerson() {cout << name << " " << age << endl;}
};int main() {string name;int age;cin >> name;cin >> age;Person p(name, age);p.showPerson();return 0;
}
cpp41.(深)拷贝构造函数
只需要看中间/的部分
#include <iostream>
#include <cstring>
#pragma warning(disable : 4996)
using namespace std;class Person {public:char* name; // 姓名int age; // 年龄Person(const char* name, int age) {this->name = new char[strlen(name) + 1];strcpy(this->name, name);this->age = age;} write your code here......// 深拷贝,对比
【牛客题霸】语法篇 - C++入门72题相关推荐
- 牛客网SQL 进阶篇刷题
牛客网SQL 进阶篇刷题(1-19) 用户1001在2021年9月1日晚上10点11分12秒开始作答试卷9001,并在50分钟后提交,得了90分: 用户1002在2021年9月4日上午7点1分2秒开始 ...
- 牛客网剑指offer编程实践1-10题
牛客网剑指offer编程实践1-10题 1.二维数组中的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这 ...
- 2020牛客国庆集训派对day2 H-STROOP EFFECT(英语题)
2020牛客国庆集训派对day2 H-STROOP EFFECT(英语题) 题目 https://ac.nowcoder.com/acm/contest/7818/H 题意 这题目真的太难读懂了,赛后 ...
- 2021牛客暑假多校第八场 K题—Yet Another Problem About Pi
2021牛客暑假多校第八场 K题-Yet Another Problem About Pi 题意:告诉你一个单元格的长和宽,问你走Π(3.1415926-)的长度距离最多可以走几个单元格 思路:沿着单 ...
- “蔚来杯“2022牛客暑期多校训练营10,签到题HFIE
题号 标题 已通过代码 通过率 团队的状态 A Everlasting Transeunt 点击查看 6/42 B Fall Guys-Perfect Match 点击查看 6/115 C Magic ...
- 牛客:【2021秋季算法入门班第七章习题:动态规划1】部分题解:方块与收纳盒、舔狗舔到最后一无所有、可爱の星空、[NOIP1999]拦截导弹
题单链接:牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com) P1001 方块与收纳盒 传送门:1001-方块与收纳盒_2021秋季 ...
- shell 脚本练习 | 「题霸」面试必考真题【shell篇】题解
写在前面: 每道shell脚本练习题都可以使用while.for.do等循环配合read,printf的方式解题,通过这种编程式的思维解题(类似C语言,通过变量与函数解题).而shell中本身就提供了 ...
- 牛客网获取输入rowinput_Python爬虫入门例题:抓取牛客网题目
最近做题的时候要写一些题解,在把牛客网的题目复制下来的时候,数学公式的处理比较麻烦,所以我用Python的selenium.urllib.request和BeautifulSoup4库对题目信息进行了 ...
- 2022牛客寒假算法基础集训营6 签到题5题(附基础集训营4-6签到题总结)
1.I-A+B问题 模拟,类似于高精度,竖式运算 #include<bits/stdc++.h> using namespace std; typedef long long LL; in ...
最新文章
- Android经常使用的五种弹出对话框
- 联合概率分布的学习笔记
- tensorflow一步一步实现一个线性回归预测模型
- 《赛博朋克2077》中有哪些新兴技术点?
- Swift - whose view is not in the window hierarchy 问题解决方法
- SQL必知必会 课后题答案
- 前端开发找实习宝贵经验总结
- OBS音频相关参数设置(一.音频的输入)
- Django 中针对基于类的视图添加 csrf_exempt
- MySQL的索引是如何实现的
- 大数据揭秘哪个省是高考地狱?结论和想象不太一样
- 计算机网络实验3.1.3·CHAP 鉴别配置
- 隆重推荐几本幼儿教育的书籍
- Chrome中实现使用迅雷一次性选中并下载网页内全部链接的方法
- 这是我裸辞接单第一个月的收入
- 【软考】--软考总结
- 4核cpu云服务器性能,4核cpu云服务器性能测试
- 【Java】云E办项目后端技术栈整合及代码阅读
- discuz 数据字典大全
- 现代密码学第一章复习题
热门文章