复试算法练习Day03
题目描述
编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次
例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3 。
数据范围: 1 <= n<=500
题目来源
(https://www.nowcoder.com/practice/eb94f6a5b2ba49c6ac72d40b5ce95f50?tpId=37&tqId=21233&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=)
输入描述
输入一行没有空格的字符串。
输出描述
输入字符串 中范围在(0~127,包括0和127)字符的种数。输入:
输入:
abc
输出:
3
输出:
输入:
aaa
输出:
1
思路
由于本题讨论的是统计(0-127)范围字符出现情况,则会出现128中可能情况字符,设置字符串str长度为128的整形数组。通过一次遍历得到每个字符情况,然后将字符元素置1,最后结束的时候将相同的元素值相加就可以获得输入的字符串的不同字符个数。
具体实现
//C++——统计字符串中的不同字符的个数
#include <iostream>
#include <string>
//数组初始化
using namespace std;
int main(){
string input;
while(getline(cin,input)){
//初始数组内容置空
int str[128]={0};
//遍历数组中元素,如果数组中的字符在ascll码的范围中则将其字符置1
for(int i=0;i<input.size();i++){
if(input[i]>=0 && input[i]<=127){
str[input[i]]=1;
}
}
int result=0;
//遍历结束之后将所有置1的元素结果相同的值相加,则可以得到不同字符个数,
//最后输出
for(int i=0;i<128;i++){
result=result+str[i];
}
cout<<result<<endl;
}
return 0;
}
##Python——统计字符串中的不同字符的个数
#利用字典遍历数组计数
#当遍历的过程中出现相同的字符的时候保持不变,
#出现不同的字符的时候,dict数组的值递增,
#直到遍历结束
def count(str)
#数组初始化
dict = {0}
#遍历str数组
for i in str:
#如果数组元素不同则加1
#相同则不变,继续向下遍历
if i in dict:
dict[i] +=1
else:
dict[i] =1
return dict
时间复杂度
采用c++一遍遍历出结果,时间复杂度为O(n)
采用Python也是利用两个数组,遍历一遍出结果,时间复杂度为O(n)
小结
通过考虑字符串的ascll码的表示来确定字符范围,根据遍历的字符串的情况,来剔除相同字符串,只考虑第一次出现情况,最后把每个第一次出现的字符串值置1,相加就得出一串字符中不同字符的个数。
利用Python可以更加简洁的采用字符比较的方式,递增第一次出现函数的数组长度,最后给出输出结果,写起来代码整体比较简洁易懂。