关闭

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

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

描述:

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


样例:

对于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.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

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

关闭

JS 洗牌算法

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

js求水仙花数_JavaScript可自定义范围打印水仙花数

水仙花数是指一个 n 位正整数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)。这篇文章主要介绍js实现生成自定义范围内的水仙花数。

indexOf实现引申出来的各种字符串匹配算法

我们在表单验证时,经常遇到字符串的包含问题,比如说邮件必须包含indexOf。我们现在说一下indexOf。这是es3.1引进的API ,与lastIndexOf是一套的。可以用于字符串与数组中。一些面试经常用问数组的indexOf是如何实现的

用 JavaScript 实现链表

单链表是表示一系列节点的数据结构,其中每个节点指向链表中的下一个节点。 相反,双向链表具有指向其前后元素的节点。与数组不同,链表不提供对链表表中特定索引访问。

JS常见简单算法排序

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

Js实现kmp算法_字符串查找算法

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息

影响计算机算法世界的十位大师

算法和程序设计技术的先驱者。Oh,God!一些国外网站这样评价他。一般说来,不知道此人的程序员是不可原谅的。其经典著作《计算机程序设计艺术》更是被誉为算法中“真正”的圣经

JavaScript实现获取两个排序数组的中位数算法示例

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。你可以假设 nums1 和 nums2 不同时为空。

js二分查找算法

二分查找高效的前提是数据结构是有序的。就好比猜1~100之间的数,先猜50,如果太大了就猜25,如果太小了就猜75.每一次都猜最大值和最小值的中间点.

JS排序算法:记数排序

计数排序是一个非基于比较的[排序算法],该算法于1954年由 Harold H. Seward 提出。 它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围), 快于任何比较排序算法。

点击更多...

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