课后作业:指针(下)
变换字母顺序
任务描述
输入一个字符串,再输入一个数组表示字符重新排序的顺序,按设定的顺序来输出一行新的字符串。要求所有数组都只能用new来申请内存。
说明
要求所有数组都只能用new来申请内存。
输入描述
第一行 $n$ 为正整数。 第二行一个字符串$ s_{0}, s_{1} \ldots s_{n-1}$ 保证其长度为n,只包含小写英文字母。 第三行n个整数p $ p_{0}, p_{1} \ldots p_{n-1}$ $=0 \leq p_{i}<n, \forall i=0 . . n-1$
输出描述
一行,答案
样例
- 样例1
- Input:
10helloworld1 3 5 7 9 0 2 4 6 8 - Output:
elwrdhlool
- Input:
- 样例2
- Input:
28kcaiibeikaninhscciaionaahnwh1 27 4 10 20 15 13 9 12 14 6 0 2 3 19 16 24 11 5 18 25 21 8 22 26 23 17 7 - Output: chinochansekaiichibannkawaii
- Input:
样例代码
#include <iostream>
using namespace std;
int main(){
int n;
cin>>n;
char *p = new char[n];
int *a = new int[n];
for (int i=0;i<n;i++){
cin>>p[i];
}
for (int i=0;i<n;i++){
cin>>a[i];
}
for (int i=0;i<n;i++){
cout<<p[a[i]];
}
/*end your code*/
return 0;
}
函数补全
任务描述
把右侧代码补充完整,包括在main函数之前添加2行代码以及在最后添加一个函数的定义,使得该程序能在一行里输出三个数:输出的第一个数是x(即用户输入的第一个数)减去y(即用户输入的第二个数)的差的个位数,第二个数是x的3倍,第三个数是y的2倍。
说明
只能填写myfun函数,不能修改main函数。
样例输入输出
- Input:
18 5 - Output:
3 54 10
参考代码
#include <iostream>
using namespace std;
int myfun(int* a, int* b);
// do not change main function
int main() {
int x, y;
cin >> x >> y;
cout << myfun(&x, &y) << ' ';
cout << x << ' ' << y;
return 0;
}
int myfun(int* a, int* b) {
// write your code here
int x=(*a-*b)%10;
*a*=3;
*b*=2;
return x;
}
敏感词过滤
任务描述
实现一个敏感词汇的程序。规则如下:
- 接受的字符:①字母;②数字;③三个标点符号(均为英文字符) ,,.,”;④三个无用的符号@,#,$。
- 对于敏感信息的词汇不区分大小写。
- 若有用信息(字母、数字)中夹杂着无用的符号,也要辨认出并滤去。假如敏感词汇是mz,那么m#z也要滤去,但是输入ml,z不用滤去。
- 过滤后若仍然存在敏感词汇,需要继续过滤,直到不存在敏感词汇
要求说明
要过滤的词汇只有L4和Fd这两个词,并且输入的字符串长度不大于200个字符。
输入输出样例
-
样例1 input:
@#$,."output:@#$,." -
样例2 input:
#f@#$$#d#output:## -
样例3 input:
f$#d26output:26 -
样例4 input:
Lfd#48output:8
参考代码
#include <iostream>
#include <cstring>
using namespace std;
int main(){
char *p = new char[200];
int *d = new int[200];
cin.getline(p, 200);
int n = strlen(p);
for (int i=0;i<n;i++) d[i]=0;
int epoch = 0;
while (true){
//cout<<"this is epoch: "<<epoch<<"-- ";
epoch+=1;
int flag = 0;
for (int i=0;i<n;i++){
if (d[i]==0){
if (p[i] == 'L' || p[i] == 'l'){
int clear = 1;
int has = 0;
for (int j=i+1;j<n;j++){
if (d[j]==0){
if (p[j]=='@'||p[j]=='$'||p[j]=='#'){
clear = 1;
//cout<<"this"<<epoch<<" "<<clear<<endl;
}
else if (p[j] == '4' && clear == 1){
for (int k=i;k<=j;k++){
d[k] = 1;
}
has = 1;
break;
}
else {
clear = 0;
break;
}
}
}
if (has == 1) flag = 1;
}
if (p[i] == 'F' || p[i] == 'f'){
int clear = 1;
int has = 0;
for (int j=i+1;j<n;j++){
if (d[j]==0){
if (p[j]=='@'||p[j]=='$'||p[j]=='#'){
clear = 1;
//cout<<"this"<<epoch<<" "<<clear<<endl;
//cout<<p[j]<<" ";
}
else if ((p[j] == 'd' || p[j] == 'D') && clear == 1){
for (int k=i;k<=j;k++){
d[k] = 1;
}
has = 1;
break;
}
else {
clear = 0;
break;
}
}
}
if (has == 1) flag = 1;
}
}
}
if (flag == 0) break;
}
for (int i=0;i<n;i++){
if (d[i] == 0){
cout<<p[i];
}
}
}
Julian历法
任务描述
Julian历法是用年以及这一年中的第几天来表示日期。设计一个函数,将Julian历法表示的日期转换成月和日,如Mar 08(注意闰年的问题)。函数返回一个字符串,即转换后的月和日。如果参数有错,如天数为第370天,返回NULL指针,此使屏幕无打印输出。
英语月份缩写为:一月Jan.二月Feb.三月Mar.四月Apr.五月May.六月Jun.七月Jul.八月Aug.九月Sept.十月Oct.十一月Nov.十二月Dec.
样例
- 样例1
- input:
20201 -
output:
Jan 01 - 样例2
input:
199833output:Feb 02
参考代码
#include <iostream>
#include <cstring>
using namespace std;
char* julian(int year, int days);
int main() {
int year, day;
char * res;
cin >> year >> day;
res = julian(year, day);
if (res) cout << res << endl;
delete [] res;
return 0;
}
char* julian(int year, int days){
char monthen[12][5] = {
"Jan","Feb","Mar","Apr","May",
"Jun","Jul","Aug","Sept","Oct",
"Nov","Dec"
};
int *a = new int[4];
if (year < 0) return NULL;
if (days < 1) return NULL;
bool judge;
if (year % 100 == 0){
if (year % 400 == 0) judge = true;
else judge = false;
}
else{
if (year % 4 == 0) judge = true;
else judge = false;
}
if (judge == true){
if (days > 366) return NULL;
int month = 0;
for (int i : {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}){
month = month + 1;
if (days < i){
int j;
for (j = 1; ; j--){
a[j] = (month % 10);
month = month / 10;
if (month == 0) break;
}
for (j = 3; ; j--)
{
a[j] = (days % 10);
days = days / 10;
if (days == 0) break;
}
break;
}
else days = days - i;
}
}
else{
if (days > 365) return NULL;
int month = 0;
for (int i : {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}){
month = month + 1;
if (days < i){
int j;
for (j = 1; ; j--){
a[j] = (month % 10);
month = month / 10;
if (month == 0) break;
}
for (j = 3; ; j--)
{
a[j] = (days % 10);
days = days / 10;
if (days == 0) break;
}
break;
}
else days = days - i;
}
}
char *res;
char *p = new char[3];
p[0] = ' ';
p[1] = a[2] + '0';
p[2] = a[3] + '0';
strcat(res, monthen[a[0]*10+a[1]-1]);
strcat(res, p);
return res;
}