当前位置:

刷题日记——矩阵转置、判断回文数(机试)

访客 2024-04-25 481 0

题目1——矩阵转置

分析

题目要求原地逆置,看了dreamjudge另外几篇题解都是用的swap交换vector向量,有一个更离谱的直接用二维数组,甚至还用新设置一个值凑三个交换,简直明目张胆地无视题目要求。

但是我觉得题目可能没有这么简单,如果要原地逆置,相似的情形只有链表原地转置,就是设置100个链表存每行的元素,然后原地逆置,但是矩阵逆置跟链表头插法原地还是有不同的,比如说,矩阵每行其实是中间不逆置,而是两边逆置,这样好像用链表也是行不通。

于是我想到用队列,先将矩阵看作一维数组,这样观察矩阵转置规律可以发现,转置过后,每一行输出的,就是按照输入顺序对n取余得到余数相同的数字,这些余数相同的数字就是它们输出矩阵的行号。

嘿嘿嘿,代码来咯!

#include <cstdio>#include <queue>using namespace std;queue<int> num[101];int main(){int n;scanf("%d",&n);for(int i=0;i<n*n;i++){int temp;scanf("%d",&temp);num[i%n].push(temp);}for(int i=0;i<n;i++){for(int j=0;j<n;j++){int temp=num[i].front();num[i].pop();printf("%d ",temp);}printf("\n");}return 0;}

判断回文数

分析

显然,这题可以从两个方面入手:

  • 方案一:使用数字,即将输入的每位数字都单独取出来,然后逐位判断,(这是我刚学c++时候这样做的)
  • 方案二:使用字符串,将输入看作字符串,然后再看作字符数组,对数组进行转置,放到新的字符串里面,然后比较一下两个字符串一不一样。

从字符串着手的代码(方案一不写了)

#include <cstdio>#include <string>using namespace std;int main(){char num[20];while(scanf("%s",num)!=EOF){string number = num;string reversed = "";for(int i=number.length()-1;i>=0;i--){reversed += number[i];}if(reversed == number){printf("Yes\n");}else{printf("No\n");}}return 0;}

发表评论

  • 评论列表
还没有人评论,快来抢沙发吧~