js实现:在字符串中找出第一个只出现一次的字符

时间: 2018-10-30阅读: 2033标签: 算法

描述:

给出一个字符串,找出第一个只出现一次的字符。


样例:

对于aabc, b为第一个只出现一次的字符. 

对于abaccdeff, b为第一个只出现一次的字符.


思路分析:

可以用对象保存字符出现的次数。


代码模板:

const firstUniqChar = function(str) {};


代码

1 、  将值删除,用 indexOf 查找还有没有相同字符,并查找之前删过的字符
const firstUniqChar = function(str) {
  str = [...str];
  let num = str.length; // 保存遍历次数
  let obj = {}; // 保存被删元素
  for (let i = 0; i < num; i++) {
    let item = str.splice(0, 1)[0]; // 删除第一个值
    if (str.indexOf(item) === -1 && obj[item] === undefined) {
      // 当前数组中没有 并且对象中也没有
      return item; // 找到
    } else {
      obj[item] = item; // 出现的字符串,用对象保存起来。
    }
  }
};
console.log('输出:', firstUniqChar('abaccdeff'), firstUniqChar('aabc'));


2、indexOf 的第二个参数,从当前值往后搜索,并查找之前已经查过的字符。想起了indexOf的第二个参数,省了一步删除的操作。

const firstUniqChar = function(str) {
  str = [...str];
  let obj = {};
  for (let [index, key] of str.entries()) {
    if (str.indexOf(key, index + 1) === -1 && obj[key] === undefined) {
      // 跳过这个元素,当后面没有 并且前面也没有
      return key; // 找到
    } else {
      obj[key] = key; // 前面出现过 存起来
    }
  }
};
console.log('输出:', firstUniqChar('abaccdeff'), firstUniqChar('aabc'));


3、记录字符出现的次数,遍历字符串,第一个只出现一次的字符,就是要找的值。

const firstUniqChar = function(str) {
  var obj = {}; // 用对象
  for (var i = 0; i < str.length; i++) {
    var code = str.charCodeAt(i);
    // 记录出现的次数
    if (obj[code] == undefined) {
      obj[code] = 1;
    } else {
      obj[code]++;
    }
  }
  for (var i = 0; i < str.length; i++) {
    // 遍历字符串出现的顺序(保证第一次出现重复),当出现为1时,即找到
    if (obj[str.charCodeAt(i)] == 1) {
      return str.charAt(i);
    }
  }
  return null;
};


原文来源:http://obkoro1.com/2018/10/27/算法-第一次只出现一次的字符/


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: http://www.fly63.com/article/detial/1225

JS数据结构与算法_链表

链表更加像是数组。链表和数组都是用于存储有序元素的集合,但有几点大不相同,链表的实现不像之前介绍的栈和队列一般依赖于数组(至少我们目前是这样实现的),它必须自己构建类并组织逻辑实现。我们先创建一个Node类

Js集合的实现与应用

与数学中的集合概念类似,集合由一组无序的元素组成,且集合中的每个元素都是唯一存在的。可以回顾一下中学数学中集合的概念,我们这里所要定义的集合也具有空集(即集合的内容为空)、交集、并集、差集、子集的特性

JS中常用的排序方法

通过相邻数据元素的交换,逐步将待排序序列变为有序序列,如果前面的数据大于后面的数据,就将两值进行交换,将数据进行从小到大的排序,这样对数组的第0个数据到N-1个数据进行一次遍历后

现在算法是新锐前端框架成功的重要因素

随着前端MVVM的流行,小型框架现在越来越难存活了!react, angular等打着大公司旗号的框架占了半壁江山,而avalon以其良好兼容性在国内份额不断上升。前端也与后端一样,遵循马太效应,强者愈强,弱者愈弱。最后只剩下两种框架

一道有意思的面试算法题

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。这道题第一眼看过去,思路挺简单的,我们只需要维护一个对象来记录每一个元素出现的次数,使用元素的值作为key,元素出现的次数作为value。

JS常见简单算法排序

我们面试中经常会遇到排序算法问题,我整理了冒泡排序、选择排序、插入插排等常见简单排序方法。希望此文想对了解排序的前端同学有所帮助。为了简单高效演示算法的实现思路,我先封装一个构造函数

JS数据结构与算法_树

一个树结构包含一系列存在父子关系的节点。每个节点都有一个父节点(除了顶部的第一个节点)以及零个或多个子节点:关于数的深度和高度的问题,不同的教材有不同的说法

为什么我认为数据结构与算法对前端开发很重要?

一个具有层级结构的数据,实现这个功能非常容易,因为这个结构和组件的结构是一致的,递归遍历就可以了。但是,由于后端通常采用的是关系型数据库,所以返回的数据通常会是这个样子:前端这边想要将数据转换一下其实也不难,因为要合并重复项

用 Javascript 写排序算法

至于为什么选择用 Javascript,则是因为我觉得 Javascript 是最方便运行和调试的,只需要复制代码粘贴到浏览器的控制台就可以了,我为所有的算法附上了测试用例,通过引入 Mocha 就可以在浏览器中显示用例的通过情况

JS 洗牌算法

最近的一个塔罗牌项目中,有一个洗牌的需求,其实也就是随机打乱数组,遂网上搜了下,再此做个整理…塔罗牌,举例来说,我们有一个如下图所示的数组,数组长度为 9,数组内元素的值顺次分别是 1~9:

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!