第一题:回文数
------取自优快云竞赛第22期第四题
题干:给定任意一个数字 m,然后给出数字 n,则需在 m 中去掉 n 位数,保持各位顺序不变的情况下,得到最大数。
实例:
输入 12314 3
输出 34
思路:首先进行数据m的排序存储,这里我们使用数组进行每一位数据的存储(0~9),
我的思想是从这个m中拿去n个数据,你也可以换成 “从m中拾取j-n个数据,组成最大值,这里j是数组的数据个数” 。在第一轮遍历中我们进行n次拿取,里面嵌套第二轮遍历,寻找每次拿去时最小值 并记录其位置,第二轮结束后相应的置-1,最后在整合数据、输出数据即可
#include <stdio.h>
int main()
{
long long m,n; //n为去掉的位数
long long m1=m;//替代品m1
int arr[10000];
int j=0;
//int arr1[10000];//最终去掉后的数的数组存放
scanf("%lld%lld",&m,&n);
while(m/10||m==1)
{
int a=m%10;
arr[j]=a;//这样m的每一位都分出来然后倒置 123---3 2 1
j++;
m=m/10;
}
//j-n;留下的位数
int min_location=0;
for(int q=0;q<n;q++)
{
int min=10;
for(int i =0;i<j;i++)
{
if((arr[i]!=-1)&&(arr[i]<min))
{
min = arr[i];
min_location=i;//留下min的位置
}
}
arr[min_location]=-1;
}
long long final=0;
for(int w=(j-1);w>=0;w--)
{
if(arr[w]!=-1)
{
final=final*10+arr[w];
}
}
printf("%lld",final);
return 0;
}
注意:边界测试,如果范围是10^15那么测试肯定会有一个数是10^15,这个就是就是 !!
第二题 :合并序列
题干:有N个单词和字符串T,按字典序输出以字符串T为前缀的所有单词。
实例:
输入
5
no
ka
ki
ku
ki
k