团体程序设计天梯赛-练习集——L1-027 出租

前言

有点难,博主做了好长时间才做出来,测试点过了,但是还是有点懵蹬,20分的题目,大家看一下吧先

L1-027 出租

下面是新浪微博上曾经很火的一张图:
在这里插入图片描述
一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1index[1]=0 对应 arr[0]=8index[2]=3 对应 arr[3]=0,以此类推…… 很容易得到电话号码是18013820100。

本题要求你编写一个程序,为任何一个电话号码生成这段代码 —— 事实上,只要生成最前面两行就可以了,后面内容是不变的。

输入格式:

输入在一行中给出一个由11位数字组成的手机号码。

输出格式:

为输入的号码生成代码的前两行,其中arr中的数字必须按递减顺序给出。

输入样例:

18013820100

输出样例:

int[] arr = new int[]{8,3,2,1,0};
int[] index = new int[]{3,0,4,3,1,0,2,4,3,4,4};

OK,以上就是全部的题目,看到题目瞬间就懵逼了,这道题,哇哦,真的,发明这个天才的人肯定是道题。
这道题说的是什么呢?一共有三个部分,分一个电话号码和两个数组,一个数组是存放的电话号码中出现过的数字,并且这些数字要从大到小排列,然后第二个数组中,存放电话号码位数的“密码”,这个密码按顺序从第一个数组中输出得到电话号码的相应位置出现的数字。

这些就是题目要做的东西了,下面看看代码

#代码1(测试点3未通过

#include <stdio.h>
#include <string.h>
int main()
{
    char tel[11];
    scanf("%s",&tel);
    char num[10] = {0};
    int count = 0,j = -1;
    int i = 0;
    for(i = 0;i < 11;i++)
    {
        if(num[tel[i] - '0'] == 0)
        {
            num[tel[i] - '0'] = 1;
            count++;
        }
    }

    
    char num1[count];
    printf("int[] arr = new int[]{");
    for(i = 9;i >= 0;i--)
    {
        if(num[i] == 1){num1[++j] = i;printf("%d",i);}
   		if(i) printf(",");
    }
    printf("};\n");

    
    printf("int[] index = new int[]{");
    for(i = 0; i < 11;i++)
    {
        for(j = 0; j < count;j++)
        {
            if(tel[i] - '0' == num1[j])printf("%d",j);
        }
         if(i < 10)printf(",");
    }
    printf("};");
}

代码2(全部通过

#include <stdio.h>
#include <string.h>
int main()
{
    char tel[11];//号码
    scanf("%s",&tel);//输入号码
    char num[10] = {0};//数字
    int count = 0,j = -1;
    int i = 0;
    for(i = 0;i < 11;i++)//计算出现过的数字
    {
        if(num[tel[i] - '0'] == 0)
        {
            num[tel[i] - '0'] = 1;
            count++;
        }
    }

    
    char num1[count];
    printf("int[] arr = new int[]{");
    for(i = 9;i >= 0;i--)//输出第一个数组
    {
        if(num[i] == 1){num1[++j] = i;printf("%d",i);if(j<count-1) printf(",");}
    }
    printf("};\n");

    
    printf("int[] index = new int[]{");
    for(i = 0; i < 11;i++)//输出第二个数组
    {
        for(j = 0; j < count;j++)
        {
            if(tel[i] - '0' == num1[j]){printf("%d",j);if(i<10)printf(",");}
        }
    }
    printf("};");
}

在这里插入图片描述

以上所有代码均为自己编写,本人水平有限,如果有哪里出错或者有更好的解法可以与我私信或在评论区里进行讨论

上一题:团体程序设计天梯赛-练习集——L1-026 I Love GPLT

下一题:团体程序设计天梯赛-练习集——L1-028 判断素数

当前提供的引用内容并未涉及 PTA 团体程序设计天梯赛 L1-039 的具体题目描述或解答方法。然而,基于以往的经验以及类似的编程竞赛题目模式,可以推测该题目的可能方向及其解决方案。 --- ### 可能的题目背景 PTA 团体程序设计天梯赛中的 L1 类型题目通常面向基础算法能力测试,主要考察选手对基本数据结构的理解、简单的逻辑推理能力和代码实现技巧。假设 **L1-039** 是一道典型的入门级题目,则其可能会围绕以下几个方面展开: 1. 字符串处理。 2. 数组操作。 3. 基础数学运算。 4. 条件分支与循环控制。 以下是针对上述可能性的一种合理推断及对应的解决思路。 --- ### 推测题目描述 #### 题目名称:字符频率统计 ##### 描述: 给定一段文本字符串,要求统计并输出每个字母(区分大小写)在字符串中出现的次数。忽略其他非字母字符。 ##### 输入格式: 单行输入,包含若干个字符组成的字符串,长度不超过 1,000。 ##### 输出格式: 按照字典序从小到大依次输出每种字母及其对应频次,格式如下: ``` a:x b:y ... z:w A:m B:n ... Z:k ``` 如果某个字母未出现过,则无需输出。 --- ### 解决方案 以下是一个完整的 C++ 实现示例,用于完成上述任务。 ```cpp #include <iostream> #include <string> #include <algorithm> using namespace std; int main() { string s; int freq[256] = {0}; // 初始化数组存储 ASCII 范围内的字符计数 // 获取输入直到 EOF 或换行结束 getline(cin, s); // 统计字符频率 for (char c : s) { if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { freq[c]++; } } // 按照字典序输出结果 for (char c = 'a'; c <= 'z'; ++c) { if (freq[c]) cout << c << ":" << freq[c] << endl; } for (char c = 'A'; c <= 'Z'; ++c) { if (freq[c]) cout << c << ":" << freq[c] << endl; } return 0; } ``` 此代码通过遍历输入字符串来记录各字母的出现次数,并最终依据字典顺序逐一展示结果[^6]。 --- ### 注意事项 尽管以上是对潜在问题的一个猜测版本,实际比赛中遇到的具体情况仍需参照官方发布的正式文档为准。对于任何特定需求下的编码实践而言,务必注意边界条件验证、异常情形捕捉等方面的工作细节以确保提交答案具备足够的鲁棒性和准确性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值