开刷NewCode华为机试---第二期

题目

描述

给定 n 个字符串,请对 n 个字符串按照字典序排列。

数据范围: 1 <= n <= 1000  ,字符串长度满足 1 <= 100 <= 100 

输入描述:

输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。

输出描述:

数据输出n行,输出结果为按照字典序排列的字符串。

问题来了!

怎么将这n个字符串存储起来呢?

难道要定义n个数组吗? 

如何进行排列呢?

字符串如何交换呢?

请思考一下!!

———————————————————————————————————————————

希望看到这的时候你已经想到了解决方案

1.存储问题:

我们可以将二维数组中的每一行存储字符串

假如不了解二维数组的可以去搜索学习一下,之后再回顾这道题

题目中也给了我们范围:

        数据范围: 1 <= n <= 1000  ,字符串长度满足 1 <= 100 <= 100 

看到这大家应该已经懂了接下来该怎么做了

定义一个二维数组arr[1000][101],

列的数不是100的原因是,字符串有结束标识符,所以多占一位,以免越界

好了 存储的问题已经解决了

2.排列问题

接下来要解决的问题是将每一个字符串按照字典序排列,那么就需要用到一个库函数strcmp

 

不了解的可以点击上方链接学习一下

之后我们遍历二维数组的行去进行比较,根据返回值判断是否需要交换

3.数据交换问题

字符串能使用的库函数还是十分方便的,为我们经常需要使用的方法提供了便利

字符串数据交换其实与整形数据交换的本质是一样的,需要一个临时变量

strcpy(temp, arr[i]);
strcpy(arr[i], arr[j]);
strcpy(arr[j], temp);

如果不懂其中原理画个图你可能就会恍然大悟了

以上就是整体解题步骤,对待一个问题要将问题刨析,细化为多个问题逐一击破

我推荐多写,多画,这样我们能更加了解问题,更好的解决问题

话不多说,直接上代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

int main()
{
	char arr[1000][101] = { 0 };
	int n = 0;
	scanf("%d", &n);
	int i = 0;
	int temp[101] = { 0 };
	for (i = 0;i < n; i++)
	{
		scanf("%s", arr[i]);
	}
	for (i = 0; i < n; i++)
	{
		int j = 0;
		for (j = 0; j < n; j++)
		{
			if (strcmp(arr[i], arr[j])<0)
			{
				strcpy(temp, arr[i]);
				strcpy(arr[i], arr[j]);
				strcpy(arr[j], temp);
			}
		}
	}
	for (i = 0; i < n; i++)
	{
		printf("%s\n", arr[i]);
	}
	return 0;
}

 假如这篇博客对你有帮助,希望能三连哦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肖晨曦7

真的有人赏我一下吗?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值