PTA乙级速刷2

文章讲述了在解决编程问题时的一些初步设想和策略,涉及到字符串大小写转换、进制转换、快速排序、数字加密、螺旋矩阵等算法问题,以及输入输出方法如scanf和sscanf的使用。同时提到了在处理数据时的空间和时间效率考虑。
摘要由CSDN通过智能技术生成

1042 字符统计

  • 初步设想,空间换时间,利用ASC码

  • 直接利用函数,将字符串中的大写改为小写

  • islower(), tolower(), a[26] = 0, getline(cin, s)

1043 输出PATest

  • 初步设想,空间换时间,设置一个容器,分别存放PATest六个字符,按序输出

1044* 火星数字

  • 初步设想:先判断需要转换的方式。主要是进制转换。

  • 写了很久,大致思路和大佬的类似,但是很多细节都不行。例如输入时数字和火星文都需要统一成字符串。在提取字符串时,用到了函数s.substr(起始位置,长度),以及字符串转换为数字stoi()

1045* 快速排序(找主元)

  • 初步设想:暴力枚举;利用快速排序形成序列,初步确定个数,再验证。假设主元有n个,设置数组为n,从左往右遍历数组,不会了,摆烂做法就是快排

  • 看了大佬的,感觉最主要的时根据快排的性质,进行了遍历优化,将问题转换成小问题。关键:排序对比+只看左边的最大值。

1046 划拳

  • 初步设想:分组进行记数,设置五个变量。

1047 编程团体赛

  • 初步设想,用字符串读入,想的是用空间换时间,但是出现段错误

  • 看答案之后,发现是个无敌简单的问题,根本不用管字符串输入,只能说scanf在有时候真的很方便输入

1048 数字加密

  • 初步设想,一头雾水

  • 大佬思想,运用逆置reverse+末尾补零(其实这里不是很明白,加零没有任何影响)再分类讨论

1049** 数列的片段和

  • 初步想法:暴力枚举

  • 看了大佬的解释,暴力枚举顶多200w次,所以no,可以找规律,化简成每个数出现的次数

1050*** 螺旋矩阵

  • 初步设想:需要排序,需要求m和n

  • 看完大佬作答,太厉害了,分层嵌套循环

  • 学到的两个技能 1 逆序排序 2 计算符合条件的m*n

代码如下

for(n = sqrt((double)N); n >= 1; n--)  //求满足条件的m和n, 满足下列条件,m*n=N,m >= n, m-n 最小
    {
        if(N%n == 0)
        {
            m = N/n;
            break;
        }
    }

int cmp(int a, int b) {return a > b;}
sort(a.begin(),a.end(),cmp);

vector<vector<int>> b(m,vector<int>(n));  //二维容器定义

1051 复数乘法

  • 我是菜狗,想不出来,想摸鱼

  • 我去看答案 ,原来可以赖皮直接算,我是笨蛋

  • 这里的重点是,数太小时需要近似为0,因为只保留两位小数

1052* 卖个萌

  • 初步想法: 字符串处理,把[]去掉,放进容器或数组中

  • 关键步骤:利用string类型的不定长的二维数组vector容器来存放表情,以及v.size()的使用方法

//定义二维数组vector
vector<vector<string>> v;
vector<string> row;
row.push_back(a[i]);
v.push_back(row);
vector<vector<string>>(3,vector<string>row);

若输入字符串中包含空格,建议用getline

1053 住房空置率

printf中使用两个百分号输出一个百分号

printf("%.1f%% %.1f%%", mayberesult, mustresult);

1054 求平均值

  • 初步设想:主要问题是判断输入数据的合法性。自己想的话,在考虑是使用整型还是浮点型还是字符串,如果是字符串的话,需要转换为整型or浮点型,条件很多

  • 直接看了大佬的,用了sscanf和sprintf

  • sscanf-从指定字符串中读进与指定格式相符的数据

sscanf(a, "%lf", &temp); //从字符串a中,读取double型数据给temp
  • sprintf-字符串格式化命令,主要功能是把格式化的数据写入某个字符串中

sprintf(b, "%.2f", temp); //将格式化后的temp放入字符串b中

1055** 集体照

  • 初步设想: 先排序,首先按照身高,如果身高相同则按照名字升序;分组,按照身高进行分组;每组排队,按照先左后右的顺序排列。

  • 不会的点:如何排序,保持姓名和身高在一起?如何按照名字排序

int cmp(struct node a, struct node b)
{
    return a.height != b.height ? a.height > b.height : a.name < b.name;
}
sort(stu.begin(),stu.end(),cmp);
  • 每排从最中间开始站,分为两边单独处理,i+2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值