zoukankan      html  css  js  c++  java
  • leetcode| Valid Anagram

    Given two strings s and t, write a function to determine if t is an anagram of s.

    For example,
    s = "anagram", t = "nagaram", return true.
    s = "rat", t = "car", return false.

    题目:这个题目意思是判断两个字母是不是构造一样,只是字母顺不一样

    思路:又是hash,只需将两个字母的及字母出现的次数得出后逐一比较每个字母的值及其次数,希望有更好方法的同仁不吝赐教,但是实现的时候,有一段逻辑让我有了另外的收获,这个很珍贵,下面是Accepted的代码,注意粗体部分

    public boolean isAnagram(String s, String t) {

      Map<Character, Integer> map_s = new HashMap<Character, Integer>();
      Map<Character, Integer> map_t = new HashMap<Character, Integer>();
      int s_len = s.length();
      int t_len = t.length();

      if(s_len!=t_len) return false;

      for (int i = 0; i < s_len; i++) {  

        char c = s.charAt(i);
        Integer count = map_s.get(c);
        if (count == null) {
          map_s.put(c, 1);
        } else {
          map_s.put(c, count + 1);
        }
      }
      for (int i = 0; i < t_len; i++) {
        char c = t.charAt(i);
        Integer count = map_t.get(c);
        if (count == null) {
          map_t.put(c, 1);
        } else {
          map_t.put(c, count + 1);
        }
      }
      boolean flag = true;
      for(Character c : map_s.keySet()){

        int cc = map_s.get(c)==null?0:map_s.get(c);
        int tc = map_t.get(c)==null?0:map_t.get(c);
        if(tc!=cc) {
          flag = false;
        }
      }
      return flag;

    }

    粗体部分我当时是这么写的,

    if(map_s.get(c)!=map_t.get(c)) {
          flag = false;
        }

    这么写,在字符少的情况下是没有问题的,字符一多,这段逻辑就报错,为什么呢?

    相信大家肯定和我一样知道这么一回事但是没在意,就是自动拆装箱,为了让基础类型的int,long,double参与面相对象的编程,java针对每一个基本类型封装了Integer,Long,Double等相应的类,在用的时候一般可以通过自动拆装箱与对应的基本类型互换,但是对于其中的转换机制不了解,导致出错,Integer转换是调用了valueOf方法

    public static Integer valueOf(int i) {
      assert IntegerCache.high >= 127;
      if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
      return new Integer(i);
    }

    valueOf处理的时候,-128-127区间的数,直接从缓存中取出返回,而不在这个byte范围内的它是new Integer(i)返回,这就导致我之前那么比较是错误的,因为二者都是new出来的不同对象,即使值相同,==比较的结构也是false

    StayHungry 求知若渴 StayFoolish 放低姿态
  • 相关阅读:
    如何刷博客园阅读量
    反反爬虫策略
    [爬虫]抓取知乎百万用户信息之总结篇
    [爬虫]抓取知乎百万用户信息之爬虫模块
    [爬虫]抓取知乎百万用户信息之Redis篇
    [爬虫]抓取知乎百万用户信息之自建代理池
    [爬虫]抓取百万知乎用户信息之HttpHelper的迭代
    [爬虫]抓取百万知乎用户设计之实体设计
    [爬虫]抓取百万知乎用户数据之爬取思路
    [深度学习]实现一个博弈型的AI,从五子棋开始(2)
  • 原文地址:https://www.cnblogs.com/wujunjie/p/5687538.html
Copyright © 2011-2022 走看看