算法题:在一个字符串中找到只出现一次的字符。如输入abaccdeeff,则输出bd。

今天的算法学习还是和字符串有关,这个题目据说是以前的某公司面试的笔试题目。题目意思就是说,在一个字符串中找到只出现了一次的那些字符,并且输出来。

作为非IT的我,平时使用Matlab比较多。不是科班出身,对于这个题目的理解可能也比较简单。但是也算是一个算法的锻炼吧,每天进步一点。一个更主要目的就是养成记录的习惯,积少成多。

不多说直接上我写的matlab代码吧

常规算法 Matlab:常规遍历

clc
clear
close all
strInput='abaccdeeff';
strLength=size(strInput,2);
if strLength==0disp('this string is null !')
end
marker=ones(1,strLength);
count=0;
letterAppearedOnce=[];
for i=1:strLengthflag=1;if marker(i)for j=i+1:strLengthif strInput(j)==strInput(i)flag=0;marker(j)=0;%break;endendelseflag=0;continue;endif flagcount=count+1;letterAppearedOnce=[letterAppearedOnce,strInput(i)];end     
end
if count==0disp('there is not letter appearing once ')
elseif count==1disp(['these is only ',num2str(count),' letter appearing once !','this letter is ',letterAppearedOnce]);
elsedisp(['these are ',num2str(count),' letters appearing once !','there letters are ',letterAppearedOnce]);
end

这个写的比较繁琐,我的思想就是主要遍历去比较吧,这里marker数组和flag变量比较重要。marker数初始时里面全是1,如果遍历比较的时候,出现了相同的,那么那个相同的字符的索引对应的marker数组的值为0,例如,
i=1时,遍历比较剩余的字符
j=3时,发现相同的字符,这marker(3)=0
这样的话第一层循环到i=3时,判断一下marker(3)是否为真,不是则停止此次循环,进行下一次循环。

flag变量确定了是否存在出现一次的字符。flag=1,存在,flag=0,不存在。

输出结果为:

These are 2 letters appearing once !there letters are:
bd

可以看出来,结果没有问题!把marker数组的结果贴出来

1   1   0   1   0   1   1   0   1   0

再换一个输入:

strInput='abaccddeeff';

得到的结果为:

There is only 1 letter appearing once !this letter is:
b

同样还是贴出marker数组:

1   1   0   1   0   1   0   1   0   1   0

再换一个输入,重复的字符在2个以上:

strInput='abacacddeccefeeff';

此时的结果为:

these is only 1 letter appearing once !this letter is:b

marker数组为:

1   1   0   1   0   0   1   0   1   0   0   0   1   0   0   0   0

这种算法比较的简单,而且比较的复杂,下面是一种简单的方法,思想比较好。

一种好的算法:利用字符ASCII码实现

因为每个字符都有一个ASCII码,所以可以定义一个用于记录字符出现次数的数组,用字符的ASCII码做为数组的下标,当遍历字符

串时,就给相应下标对应的字符次数加1。这样对字符串的一次遍历就能记录每个字符出现的次数。再找到次数为的1的索引,即

字符出现一次的字符的 ASCII

clc
clear
close all
strInput='abaccdeeff';
strLength=size(strInput,2);
if strLength==0disp('this string is null !')
end
strAscll=zeros(1,256);
for i=1:strLength   strAscll(abs(strInput(i)))=strAscll(abs(strInput(i)))+1;
end
char(find(strAscll==1))

输出结果为

    ans =bd

这种算法十分的简单明了!几乎就是一个遍历,其他的判断全部都没有。最后得到的结果就是这么的完美!

Python 3 实现:字典数据结构的利用

Python3 的字典这种数据结构还是比较好的,原理就不多说了,直接看代码就能体会到这个得妙处:

def find_once_appear_letter(string):d={}onceAppearLetter=''for i in string:d[i]=d.get(i,0)+1for item in d.items():if item[1]==1:onceAppearLetter+=item[0]return onceAppearLetterif __name__ == "__main__":str='abaccdeeff'print('The string is :\n')print(str)print()print('the letters appearing only once are:\n') print(find_once_appear_letter(str))

结果为:

这里写图片描述


完美,学无止境!


艾勇 上海交通大学
2017/7/27

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka的Spring Cloud Stream

总览 该示例项目演示了如何使用事件驱动的体系结构 , Spring Boot ,Spring Cloud Stream, Apache Kafka和Lombok构建实时流应用程序。 在本教程结束时,您将运行一个简单的基于Spring Boot的Greetings微服务 从REST API获取消息 …

常见的股票技术因子学习以及计算

最近在看《量化投资数据挖掘技术与实践(MATLAB版)》。学习了其中的常见的股票衍生变量,并且利用WIND金融数据终端的matlab借口windmatlab导出一些数据进行了一个简单的学习。特此记录。 下面是我对于书中提到的几个因子的学习总结&#xff1…

Java – HashMap详细说明

HashMap基于哈希算法工作,根据Java文档HashMap具有以下四个构造函数, 建设者 描述 HashMap ​() 构造一个空的 具有默认初始容量(16)和默认加载因子(0.75)的HashMap 。 HashMap ​(int initialCapaci…

Python实现石头-剪刀-布小游戏

近日在学习Python的一些基础知识,觉得还是很有趣的一个一门语言!就目前的学习的一些知识,编写了一些一个简单的石头剪刀布的游戏。主要是熟悉一些Python的一些控制语句。 import random while 1:sint(random.randint(1,3))print(s)print()if…

Python:递归输出斐波那契数列

今天学习Python的时候做一道练习题,题目是这样的: 题目 导入 问题 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总对数为多…

排序算法二:快速排序算法原理以及MATLAB与Python实现

今天继续学习排序算法。今天的主角是快速排序算法。 1. 快速排序基本原理 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。 该方法的基本思想是: 1.先从数列…

排序算法三:堆排序基本原理以及Python实现

1. 基本原理 堆排序就是利用堆的特性进行一个无序序列的排序工作。 堆的特点 堆分为最大堆和最小堆,其实就是完全二叉树。 最大堆要求节点的元素都要不小于其孩子最小堆要求节点元素都不大于其左右孩子。 两者对左右孩子的大小关系不做任何要求,其实…

spring jms 消息_Spring JMS,消息自动转换,JMS模板

spring jms 消息在我的一个项目中,我应该创建一个消息路由器,就像所有路由器一样,它应该从一个主题获取JMS消息并将其放入另一个主题。 该消息本身是JMS文本消息,实际上包含XML消息。 收到消息后,我还应该添加一些其他…

排序算法四:归并排序基本原理以及Python实现

1. 基本原理 归并排序建立在归并操作上的一种算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是将两 个已经有序的序列合成一个有序的序列的过程。 因此,对于一个待排序的序列来说,首先要将其进行…

如何将JAR添加到Jetbrains MPS项目

Jetbrains MPS是创建DSL的绝佳工具。 我们喜欢它,并在我们的咨询工作中定期使用它。 因此,我们之前已经写过关于Jetbrains MPS的文章 。 作为投影编辑器,您可以轻松创建可通过图形界面或数学公式之类使用的DSL。 尽管所有这些功能都需要做一…

Python 3实现k-邻近算法以及 iris 数据集分类应用

前言 这个周基本在琢磨这个算法以及自己利用Python3 实现自主编程实现该算法。持续时间比较长,主要是Pyhton可能还不是很熟练,走了很多路,基本是一边写一边学。不过,总算是基本搞出来了。不多说,进入正题。 1. K-邻近…

UART原理

UART原理 通用异步收发传输器(Universal Asynchronous Receiver / Transmitter),通常称作UART,是一种异步收发传输器,是电脑硬件的一部分。将资料由串行通信与并行通信间作传输转换,作为并行输入成为串行输出的芯片&am…

AttributeError: module 'tensorflow' has no attribute 'placeholder'等一系列tensorflow版本导致的问题

新人tensorflow2.1版本导致程序我无法运行最简单的办法 法1 tensorflow.compat.v1 import tensorflow.compat..v1 as tf tf.disable_v2_behavior() 亲测不好用 法2 卸载2.1,安装老版本 在Terminal界面输入 pip uninstall tensorflow接着输入Y确定卸载。 安装t…

word中一直提示校对错误,如何关闭当前文档校对功能

关闭当前文档校对功能 文件>选项>校对>例外项,选中两个,如图 对比效果:

将测微仪与Spring Boot 2一起使用

这是快速入门,介绍了如何使用出色的Micrometer库来检测基于Spring Boot 2的应用程序并在Prometheus中记录指标 介绍 Micrometer在各种监视工具提供的客户端库上提供了基于Java的外观。 以Prometheus为例,如果我要将Java应用程序与Prometheus集成&#…

与Maven的集成测试

用Maven实施单元测试是很普通的事情,我们大多数人都熟悉项目结构以及单元测试所在的位置。 但是,集成测试是一种不同的情况,大多数情况下它们具有完全不同的要求。 例如,可以让您的单元测试在内存数据库中的h2上运行,…

通信原理-通信系统的组成

第一章 通信系统的组成 1、通信系统一般模型 发送设备:将信源产生的原始电信号变换成适合在信道中传输的形式。变换方式有调制、放大、滤波、编码、多路复用等。 信道:传输信号的通道.即传输媒质。在给子信号通道的同时,信道也会对信号产生损…

使用log4j2免费分配日志记录

介绍 最近,我正在为一个客户端工作,试图为大型精心制作的Java系统消除一些GC暂停。 经过分析后,我意识到大部分垃圾都是通过日志记录产生的! 是否有一种简单的方法来删除所有分配? 原来有:) 我应该使用哪个框架进行GC…

Verilog中fork...join 的用法

特点 中间的语句并行执行;(延时不累加) 不能用于综合; 代码 module signal_gen; reg wave; parameter cycle 5; initial beginforkwave 0;#(cycle) wave 1;#(2*cycle) wave 0;#(3*cycle) wave 1;#(4*cycle…

使用JWT的Cloud Native应用程序

本机云应用程序是为云计算环境开发的应用程序。 对于“ 什么是云原生应用程序 ”这个问题没有具体答案,但是必须满足不同的概念。 在我看来,最重要的功能之一就是能够快速缩放 。 这意味着我们的应用程序在每台服务器上都无法具有任何状态,…