每日一题
Training my ability about thinking and coding
Record_B1005(25):
- Vector(向量)
- 是一个封装了动态大小数组的顺序容器,可以理解为vector是一个能够存放任意类型的动态数组;
- 创建一个vector动态数组:
vector<Type> name(动态数量)
- vector有
vector.begin()
: 给出第一个元素的指针;vector.end()
:给出最后一个元素的下一个位置的指针;
- Sort (排序函数)
- sort(first,last)---默认按升序
- 如果降序,可以通过reverse反转,也可以如下:
sort(first,last,greater<Type>())
即可
Record_B1006(15):
- Switch(condition)
- condition>0为True
- case下可以带任何循环
Recode_B1007(20):
- 通过内部函数
issushu
来判断素数,代码如下 -
bool issushu(int x) { int k, i; k = (int) sqrt((double) x); for (i = 2; i <= k; ++i) { if (x % i == 0)break; } if (i > k) return true; else return false; };
Recode_B1009(20):
- Stack(堆栈)支持的基本操作
- 入栈:如
s.push(x)
; - 出栈:如
s.pop()
.注意:出栈操作只是删除栈顶的元素,并不返回该元素。 - 访问栈顶:如
s.top()
; - 判断栈空:如
s.empty()
.当栈空时返回true。 - 访问栈中的元素个数,如
s.size()
;
- 入栈:如
- String
strcpy(s1, s2)
复制字符串 s2 到字符串 s1。strcat(s1, s2)
连接字符串 s2 到字符串 s1 的末尾。连接字符串也可以用 + 号,例如:string str1 = "runoob"; string str2 = "google"; string str = str1 + str2;
strlen(s1)
返回字符串 s1 的长度。strcmp(s1, s2)
如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回值小于 0;如果 s1>s2 则返回值大于 0。strchr(s1, ch)
返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。strstr(s1, s2)
返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置
Recode_B1010-1011(25_15):
- 两题都是挺简单的
- 对于区间[-2^31,2^31],需要long long int
- 注意cin的数据的范围,做好if判断
Recode_B1012(20):
switch
来分类- b[]来记录是否存在,其中b[0]一开始放的不对,导致出问题,要和数组a同步更新
Recode_B1013(20):
- 再次用到前面的
issushu
函数来判断素数 - 两层for循环,第一层先找出需要的素数,第二层输出即可
今天CLion中的编译器出了问题,因为删除了Xcode.app。 后续解决问题花了很多时间,Xcode下回后只需要删除当前项目,重新git上clone就可以了。 跟着网友建议,在host上增加了ipv4 rew.githubuserconnect.com,为了下homebrew,但是并没有成功,问题还是存在,host文件也没改回去,记录这个事情,防止忘记
Recode_B1014(20):
string
直接获取一行字符串,可以通过下标对字符串遍历/比较等操作isdigit()
判断是否是数字isalpha()
判断是否是字母-
const char *day[7] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"}; string week[7] = {"MON ", "TUE ", "WED ", "THU ", "FRI ", "SAT ", "SUN "}; //两句是一样效果,第一句是通过指针+数组的方式来达到字符串数组的目的
-
printf("%02d:%02d", m, j); //output: 14:03 //%02-->数字要达到2位,达不到的位用0填充
Recode_B1015(25):
- Vector ~ B1005
-
vector<int> v[3]; //vector作为容器 // 此句相当于创建了三个vector容器,每个容器都是可动态扩展的 v[0].push_back(1); v[0].push_back(2); //push_back()函数是向容器尾部插入元素 //这句==向第一个容器尾部插入int类型元素1,2 cout<<v[0][0]; cout<<v[0][1]; //为什么是v[0][0]?因为在下标为0的容器下只插入了两个元素 // 所以只有一个下标为0,1的元素,从而变成类似二维矩阵的输出格式
Recode_B1016(15):
- different from github/PAT
-
string a, b; int da, db, pa = 0, pb = 0; cin >> a >> da >> b >> db; //她的处理方法:a[i]-'0',用的是字符串 for (int i = 0; i < a.length(); i++) if (da == (a[i] - '0')) pa = pa * 10 + da; for (int i = 0; i < b.length(); i++) if (db == (b[i] - '0')) pb = pb * 10 + db; cout << pa + pb; //mine a%10直接算的 long long int a,b; int da,db,suma=0,sumb=0; cin >> a>>da>>b>>db; while(a){if(a%10==da)suma=da+10*suma;a/=10;} while(b){if(b%10==db )sumb=db+10*sumb;b/=10;}
Recode_B1017(20):
- A除以B 问题
- not finished
- GitHub/PAT 用String字符来进行除法运算//还没有看完
Recode_B1018(20):
- 锤子剪刀布:用空间换时间?感觉都不占优势,对比PAT,可以再看下
Recode_B1019(20):
-
#include <iostream> #include <algorithm> using namespace std; bool cmp(char a, char b) {return a > b;} int main() { string s; cin >> s; s.insert(0, 4 - s.length(), '0');//insert()在pos的位置插入n个c字符 do { string a = s, b = s; sort(a.begin(), a.end(), cmp);//降序 sort(b.begin(), b.end());//默认升序 //stoi(const string*),都是字符处理函数,把数字字符串转换成int类型 //atoi(const char*),需要c_str()把string转换成char类型 int result = stoi(a) - stoi(b); s = to_string(result);//s 更新为计算结果,进入下一个迭代 //将带符号整数转换成对应的字符串,可参考C++的API //https://www.apiref.com/cpp-zh/cpp/string/basic_string/to_string.html s.insert(0, 4 - s.length(), '0'); cout << a << " - " << b << " = " << s << endl; } while (s != "6174" && s != "0000"); return 0; }
Recode_B1020(25):
- 逻辑没问题,但始终有一个错误,查不到测试用例,不清楚哪里有问题
- PAT解答如下
-
//创建mooncake类 struct mooncake{ float mount, price, unit; }; //用于升序排序 int cmp(mooncake a, mooncake b) { return a.unit > b.unit; } int main() { int n, need; cin >> n >> need; vector<mooncake> a(n); //vector容器经常使用到 for (int i = 0; i < n; i++) scanf("%f", &a[i].mount); for (int i = 0; i < n; i++) scanf("%f", &a[i].price); for (int i = 0; i < n; i++) a[i].unit = a[i].price / a[i].mount; sort(a.begin(), a.end(), cmp);//降序 float result = 0.0; for (int i = 0; i < n; i++) { if (a[i].mount <= need) { result = result + a[i].price; } else { result = result + a[i].unit * need; break; } need = need - a[i].mount; } printf("%.2f",result); return 0; }
Recode_B1021(15):
- 在对数组使用的过程中,应该多注意是否需要初始化为0,部分题目编译与CLion不一样
Recode_B1022(20):
- 加法转换成D进制,直接用数组处理,注意存储单元的大小控制;
Recode_B1023(20):
- 组个最小数,除了数组初始化为0,输出的判断条件是前期没有通过的问题
Recode_B1024(20):
- 科学计数法,分段处理数字,E的前面数字部分,E的后面数字部分
stoi(string类型)
将string类型转换成int型数据substr()
返回一个新建的、初始化为string对象的子串的拷贝string对象。- 子串是,在字符位置pos开始,跨越len个字符(或直到字符串的结尾,以先到者为准)对象的部分。pos+len-1=末尾位置
abs(n)
取绝对值
Recode_B1025(25):
reverse()
逆序(反转)常用于数组、字符串、容器等,属于C++等新增函数-
#include<algorithm> //交换vector容器中元素的顺序 vector<int> v = {5,4,3,2,1}; reverse(v.begin(),v.end());//v的值为1,2,3,4,5 //交换string类的字符串 string str="www.mathor.top"; reverse(str.begin(),str.end());//str结果为pot.rohtam.wwww //函数原型,函数内部调用iter_swap命令来交换元素位置 template <class BidirectionalIterator> void reverse (BidirectionalIterator first, BidirectionalIterator last) { while ((first!=last)&&(first!=--last)) { std::iter_swap (first,last); ++first; } }
-
- 答案妙在:data、next、list数组的下标是当前结点的地址;再用list数组串成链式结构
- 后续通过判断条件
i < (sum - sum % k)
,用reverse()
反转数组;再用一层for循环输出结果;
Recode_B1026(15):
- 程序运行时间
- 对于second四舍五入的操作,先有
+50
的操作,就属于四舍五入的操作
Recode_B1027(20):
- 打印沙漏
- 数学规律上找平均数,来找出row
- 数学规律应该输出每行几个"符号"
Recode_B1028(20):
- 人口普查
- 简单的用字符串来比较年龄大小
Recode_B1029(20):
string.find(string[])
- find()函数用于找到字符串里是否有字符string[]
string::npos
- npos可以表示string的结束位子,是string::type_size 类型的,也就是find()返回的类型。find函数在找不到指定值得情况下会返回string::npos
//如果没有,ans里也没有,就加进ans里 if (s2.find(s1[i]) == string::npos && ans.find(toupper(s1[i])) == string::npos) ans += toupper(s1[i]);//转换成大写
toupper(s1[i])
———将字符变成大写字符
Recode_B1030(25):
- 完美数列