zoukankan      html  css  js  c++  java
  • 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

    题目:

    给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

    
    

    案例:

    
    

    s = "leetcode"
    返回 0.

    
    

    s = "loveleetcode",
    返回 2.






    解法一 : 有点暴力,主要思路为抛出本身后,利用indexOf查询查找是否存在重复值,不存在则直接返回当前索引
    /*
    * * @param {string} s * @return {number} */ var firstUniqChar = function(s) { var len = s.length; for(var i=0;i<len;i++){ var str = s, test = str.split(''); test.splice(i,1); var sub = test.indexOf(s[i]); if(sub === -1) return i; } return -1; };
    解法二:
    这里的思路是利用中间变量做计数器 ,记录重复个数。一旦遇到重复直接跳出这次循环,去查找下一个数是否匹配。以此类推,一旦遇到第一个不重复的则直接返回 当前索引 中断所有循环

    /*
    * * @param {string} s * @return {number} */ var firstUniqChar = function(s) { var len = s.length;
      //循环每个需要对比的值
    for(var i=0;i<len;i++){
        //引入计数器
    var sub = 0;
        //循环每个除本身以外的参照值
    for(var j=0;j<len;j++){
            //遇到重复且非本身 计数器累加 且直接跳出循环进行下一次对比
    if(s[i] === s[j] && i!==j) {
              sub++;
              break;
            } }
    if(sub === 0) return i; } return -1; };
    方法三
      方法二始终觉得重复循环次数过多 而且时间复杂度也达到了O(n^2),
      则想到了利用哈希来存储重复的次数,在循环字符串查找哈希中值为1的这个字符,第一次遇到则返回,这样循环次数相对减少时间复杂度也降到了O(n)
    /*
    * * @param {string} s * @return {number} */ var firstUniqChar = function(s) { var len = s.length, haxi = {}; for(var i=0;i<len;i++){ var sub = haxi[s[i]]; if(sub){ haxi[s[i]] = ++sub; }else{ haxi[s[i]] = 1; } } for(var i=0;i<len;i++){ if(haxi[s[i]] === 1) { return i } } return -1; };

    除了上述解法之外,基于解法二思路想到的解法思路,

      即第一次将字符串中与第一个字符重复的字符提取出,返回提取后的新字符串,进行下一轮提取,知道遇到第一个提取不到重复值的字符,利用indexOf查询这个字符串返回其索引,或则无不重复直接返回-1

  • 相关阅读:
    Linux系统管理10-----进程和计划任务管理
    07作业进程和任务管理
    Linux系统管理09-----引导过程与服务过程
    网站部署流程
    Docker 安装与使用
    基于NFS共享实现kvm虚拟主机
    GlusterFS 部署
    rsync 远程同步服务部署
    Zabbix 通过 JMX 监控 tomcat
    Zabbix 简单错误 解决方法
  • 原文地址:https://www.cnblogs.com/jjq-exchange/p/11199101.html
Copyright © 2011-2022 走看看