复试算法练习Day03——字符串中的字符个数

复试算法练习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可以更加简洁的采用字符比较的方式,递增第一次出现函数的数组长度,最后给出输出结果,写起来代码整体比较简洁易懂。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值