目录
一、前言
二、题目
三、题目分析
(一)明确需求
(二)分析思路
四、将思路转变为一个程序
C++代码
C代码
注释:
五、总结
一、前言
作为博主在本系列文章中的第一篇文章,博主先对本系列做一个简单的介绍。
本系列致力于以每日一题这种循序渐进的方法来教大家如何进行题目理解,学习解题思路,扩展解题思维。博主保证博客讲解清晰、思路明确,也希望可以给大家带来满意的收获。
现在CSDN网站上写每日一题类型的博主有不少,但是能够对题做到详细清晰讲解的博主却是很少的,甚至很多文章只是写了一个题目和一个答案就结束了。博主个人认为原因有以下几种:
1、本身并非以讲题解题为目的来写博客,而是单纯以总结自己学到了什么,做了什么为目的。这种纯个人总结性文章,对通过看博客来学习的同学而言用处是及其有限的。
2、部分博主写的博客的受众下线是非常高的,也就是说想要看懂这些文章本身就需要有非常深厚的思维能力和经验水准了,而这又对大部分需要通过看博客来提升自己的同学而言是极不友好的。
博主写这一个系列目的:
1、对个人刷题进行复盘,并督促自己的学习进程。
2、明确解题思路,刨析题目核心,借此培养解题思维。
这对博主自己而言可以对所写的题目进行复习,对解题思路进行回顾,所以必然是讲解越清楚越好;对大家而言便能深入理解到该题的核心及其思考过程,从而学到解题思维,扩展解题思路。
二、题目
实现一个算法来识别一个字符串的字符是否是唯一的(忽略字母大小写)。若唯一,则输出YES,否则输出NO。输入描述:
输入一行字符串,长度不超过 100。
输出描述:
输出一行,若字符串的字符是唯一的,则输出YES,否则输出NO。
三、题目分析
(一)明确需求
根据题目描述,我们是要实现一个判断字符串中的字符是否只出现了一次的算法,并且明确表述了忽略大小写,消除了我们对特殊情况如‘A'与'a'是否算相同的顾虑。题目中明确提到了输入描述,所以我们在程序设计时,必须设置一个变量来接收从输入流输入的数据。
输入流和输出流是计算机编程中用于处理数据的核心概念,主要用于读取和写入数据。
定义和用途
输入流(InputStream):用于从数据源读取数据,如文件、网络连接等。输入流只能读取数据,不能写入数据。
输出流(OutputStream):用于将数据写入目标,如文件、网络连接等。输出流只能写入数据,不能读取数据。
说白了便是:输入流用于接收从键盘(输入设备)输入的数据,输出流便是将你要输出的信息输出到显示器(输出设备) 上。
前面说了我们要设置一个变量来接收数据,那么这个变量要多大呢?最大100个字符,所以我们使用一个大小为100的字符数组便可以了。(在C语言中没有字符串类型,所以我们会使用字符数组来表示字符串)另外还有一个十分容易出错的地方便是输出,如输出描述中说的,我们要根据判断输出"YES"或"NO",但是同样的情况若我们输出的是“yes”或“no”算对还是算错?根据人为判断,我们说“YES”还是“yes”都是表示对的,但是由于计算机中大小写字母的编码不同,"yes" != "YES"。
(二)分析思路
要解决这一个问题很简单,和我们肉眼分辨一样,我们只需要先记住一个字符,在从除这个字符之外的字符中找,判断是否有和它一样的字符,所以我们可以采用双层循环加判断的方法进行解答。
注意我标粗的部分,这就是我们要设计的算法中的主要内容。
四、将思路转变为一个程序
博主写了C++版本与C版本的代码,对于使用如JAVA或Python语言的同学,根据格式替换即可。
C++代码
#include <iostream>
#include <string.h>
using namespace std;
int func(char* aim, int len)
{
int i = 0;
int j = 0;
//主要内容
for (i = 0; i < len; i++)//记住一个字符
{
for (j = 0; j < len; j++)
{
if (aim[i] == aim[j] && i != j)//从其它字符中判断是否有和它一样的字符
{
cout << "NO" << endl;
return 1;
}
}
}
cout << "YES" << endl;
return 0;
}
int main()
{
char aim[100];//设置一个大小为100的字符数组接收数据
cin >> aim;
int len = strlen(aim);//借助strlen函数确定字符串大小,以此确定边界
func(aim, len);
return 0;
}
C代码
#include <stdio.h>
#include <string.h>
int func(char* aim, int len)
{
int i = 0;
int j = 0;
//主要内容
for (i = 0; i < len; i++)//记住一个字符
{
for (j = 0; j < len; j++)
{
if (aim[i] == aim[j] && i != j)//从其它字符中判断是否有和它一样的字符
{
printf("NO\n");
return 1;
}
}
}
printf("YES\n");
return 0;
}
int main()
{
char aim[100];//设置一个大小为100的字符数组接收数据
scanf("%s", aim);
int len = strlen(aim);//借助strlen函数确定字符串大小,以此确定边界
func(aim, len);
return 0;
}
注释:
对于strlen函数的用法我在之前的博客中已经进行了详细的讲解,不太清楚的同学可以看一下我前几期的博客。
五、总结
本期博客所选用的题目相对较于简单,但对于算法思维的培养却有不小的帮助。从思路到实现一一对应、有条不紊,“思路贯通而不滞” ,这便是算法思维。
如果喜欢本篇博客的同学可以点赞加收藏,如果期待后期博客的同学也可以给博主点一个关注。
如果文章出错可随时在评论区斧正,哪里有不清楚的地方也可以在评论区进行讨论,博主看到必答。