《剑指offer—面试题50:第一个只出现一次的字符》

《剑指offer—面试题50:第一个只出现一次的字符》
注明:仅个人学习笔记

import java.util.HashMap;
import java.util.Map;

/**
*
*
* 第一个只出现一次的字符
*
* 在字符串中,找出第一个只出现一次的字符 如输入“abaccdeff” 输出‘b’
*
* FirstNotRepeatingChar输出第一个只出现一次的字符
* FirstNotRepeatingCharIndex输出第一个只出现一次的字符的位置
*
*/

public class FirstNotRepeatingChar50
{

// 输出第一个只出现一次的字符
public Character FirstNotRepeatingChar(String str)
{

    if (str == null || str.length() == 0)
    {
        return 0;
    }

    Map<Character, Integer> map = new HashMap<Character, Integer>();

    for (int i = 0; i < str.length(); i++)
    {
        char curChar = str.charAt(i);

        if (map.containsKey(curChar))
        {
            int time = map.get(str.charAt(i));
            map.put(curChar, ++time);
        } else
        {
            map.put(curChar, 1);
        }

    }

    // Character ch1 = null;
    //
    // for (Character key : map.keySet())
    // {
    // if (map.get(key) == 1)
    // {
    // ch1 = key;
    // break;
    // }
    //
    // }

    // 因为hashmap的Key值会自动字典排序,比如google,e作为key就会排到l前面,但实际上第一次出现一次的字符应该是l,直接去遍历map找value=1的Key会输出e
    // 所以应该顺序遍历字符串,然后找每次遍历的字符的key,找到第一个value等于1的,即为所求
    for (int i = 0; i < str.length(); i++)
    {
        char c = str.charAt(i);
        if (map.get(c) == 1)
        {
            return c;
        }
    }

    return null;
}

// 输出第一个只出现一次的字符的所在位置
public int FirstNotRepeatingCharIndex(String str)
{

    if (str == null || str.length() < 0 || str.length() > 10000)
    {
        return -1;
    }

    Map<Character, Integer> map = new HashMap<Character, Integer>();

    for (int i = 0; i < str.length(); i++)
    {
        char curChar = str.charAt(i);

        // 判断当前字符是一个英文字母,是的话才进行遍历和后续添加
        if ((curChar >= 'A' && curChar <= 'Z') || (curChar >= 'a' && curChar <= 'z'))
        {
            if (map.containsKey(curChar))
            {
                int time = map.get(str.charAt(i));
                map.put(curChar, ++time);
            } else
            {
                map.put(curChar, 1);
            }

        } else
        {
            map.clear();
            System.out.println(str + " :字符串中包含非字母字符");
            return -1;
        }

    }

    int pos = -1;
    int i = 0;
    for (; i < str.length(); i++)
    {
        char c = str.charAt(i);
        if (map.get(c) == 1)
        {
            return i;
        }
    }
    return pos;
}

public static void main(String[] args)
{
    FirstNotRepeatingChar50 f = new FirstNotRepeatingChar50();

    // String str = "aAacdeff";
    //String str = "Z*google";
    String str = "NXWtnzyoHoBhUJaPauJaAitLWNMlkKwDYbbigdMMaYfkVPhGZcrEwp";

    Character ch = f.FirstNotRepeatingChar(str);

    System.out.println(ch);

    int index = f.FirstNotRepeatingCharIndex(str);
    System.out.println(index);

    // int index = f.FirstNotRepeatingChar1(str);
    // System.out.println("字符" + ch + "是字符串" + str + "中第一个只出现一次的字符,且出现位置是:" +
    // index);
}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值