(1)Valid Anagram

解题思路:

使用一个数组,首先遍历S相应位置加1,然后遍历T,判断此时如果相应位置为零返回FALSE,否则就减一。T遍历完毕后返回true.

代码如下:

 public class Solution {
public boolean isAnagram(String s, String t) {
if (s == null || t == null || s.length() != t.length()) {
return false;
}
int[] alphabet = new int[26];
for (int i = 0; i < s.length(); i++) {
alphabet[s.charAt(i) - 'a']++;
}
for (int i = 0; i < t.length(); i++) {
if (alphabet[t.charAt(i) - 'a'] == 0) {
return false;
}
alphabet[t.charAt(i) - 'a']--;
}
return true;
}
}

(2)Longest Palindrome

解题思路:

  • 这里是要求出最长回文子串的长度,而不是求出最长回文子串
  • 当字符串中字符出现次数为偶数时,必然可以加入最长回文子串
  • 当字符串中字符出现次数为奇数时,分情况讨论:
  • 如果出现次数为大于1的奇数n,则可以加入n-1个对应字符到最长回文子串
  • 最终的最长回文子串,最中间还可以加入一个单一字符
  • 上面两条合并起来,即可以直接将出现最大奇数次数的字符都加入最长回文子串
  • 即if(出现奇数次数的字符数==0),return s.length()
  • if(出现奇数次数的字符数!=0),return s.length()- 出现奇数次数的字符数+1

解法一:使用Hashset,偶次数出现的字符可以直接消掉,奇数次出现的字符可以消掉偶数个,剩余一个。如果最终set集合不为空,证明有剩余单个字符只能再加入回文串中一个。代码如下:

 public class Solution {
public int longestPalindrome(String s) {
if (s == null || s.length() == 0) {
return 0;
}
HashSet<Character> set = new HashSet<Character>();
int count = 0;
for (int i = 0; i < s.length(); i++) {
if (set.contains(s.charAt(i))) {
set.remove(s.charAt(i));
count++;
} else {
set.add(s.charAt(i));
}
}
if (!set.isEmpty()) {
return count*2 + 1;
} else {
return count*2;
} }
}

注意其中set.contains(),set.add(),set.isEmpty(),s.charAt(i)[取字符]的用法。

解法二:使用一个数组记录下每个字符出现的次数。如果为偶次数,直接加入字符串;如果是不为1的奇数次n,加入字符串中n-1的长度;同时记录只出现一次的字符个数。最后判断如果只出现一次的字符个数不为0,返回结果为字符串长度加一;如果为0 ,返回字符串长度即可。代码如下:

 public class Solution {
public int longestPalindrome(String s) {
int[] charStatArray = new int[52];
int oneTimeOddCount = 0;
int evenCount = 0; for (char ch: s.toCharArray()) {
if (ch >= 97) {
charStatArray[26 + ch - 'a']++;
}
else {
charStatArray[ch - 'A']++;
}
} for (int cnt: charStatArray) {
if (cnt != 0) {
if (cnt % 2 == 0) {
evenCount += cnt;
} else {
if (cnt == 1) {
oneTimeOddCount++;
}
else {
evenCount += cnt - 1;
oneTimeOddCount++;
}
}
}
} return oneTimeOddCount > 0 ? 1 + evenCount : evenCount;
}
}

注意:String.toCharArray()作用是将字符串转化为字符数组

(3)Intersection of Two Arrays II

解题思路一:对nums1使用HashMap,(nums[i],i) i里面存的是该字符出现的次数。依次判断nums2中的字符是否出现在nums1,如果出现且当前存在的次数大于0,就将该字符存入结果list中,并将map中的次数减1。最后以数组形式返回list中的结果即可。

代码如下:

 public class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < nums1.length; i++) {
if (map.containsKey(nums1[i])) {
map.put(nums1[i], map.get(nums1[i]) + 1);
} else {
map.put(nums1[i], 1);
}
} List<Integer> list = new ArrayList<Integer>(); for (int i = 0; i < nums2.length; i++) {
if (map.containsKey(nums2[i]) && map.get(nums2[i]) > 0) {
list.add(nums2[i]);
map.put(nums2[i], map.get(nums2[i]) - 1);
}
} int[] result = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
result[i] = list.get(i);
}
return result;
}
}

解题思路二:

1)对数组nums1进行排序;

2)对数组nums2进行排序;

3)遍历数组nums1和nums2中元素,并比较对应的元素,

  • 若相等,则将其保存到输出结果中,并变化两个数组对应的索引
  • 不等,则变化较小元素对应的索引即可。

代码如下:

 public int[] intersect(int[] nums1, int[] nums2){
Arrays.sort(nums1);
Arrays.sort(nums2);
ArrayList result = new ArrayList();
for (int i = 0, j = 0; i < nums1.length && j < nums2.length; ){
if (nums1[i] == nums2[j]){
result.add(nums1[i]);
i++;
j++;
} else if (nums1[i] < nums2[j]) {
i++;
} else {
j++;
}
}
int[] res = new int[result.size()];
for (int i = 0; i < result.size(); i++){
res[i] = (int) result.get(i);
}
return res;
}

Continue To DO!的更多相关文章

  1. c#while循环注意continue的地方

    在使用while 时发现一个很大的问题,continue最好慎用! private void do() { int i = 0; while (true) { //continue;//绝对的死循环 ...

  2. 【PAT-二叉树】L2-011. 玩转二叉树- 仅仅开100大的数组模拟即可!

    L2-011. 玩转二叉树 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.(我的分析:无非就是说把左子树当成 ...

  3. 网络通信简单实例BIO,NIO,AIO

    这里,我将做一个简单的通信程序,分别使用三种原始的通信工具:BIO,NIO,AIO. 功能就是一个服务器,一个客户端.服务器就是处理请求,返回响应.而客户端就是连接服务器,发送请求,接收响应. 第一步 ...

  4. python之购物车的编写(熬夜撸代码中。。。)

    购物车的编写对于我这种不是很精通函数的小白来说,简直太难了.各种坑,各种无奈啊!不过总算也是写出来了! 不多说,直接上代码! #!/usr/bin/env python#用户名 sanjiang#密码 ...

  5. 转:RTMPDump源代码分析

    0: 主要函数调用分析 rtmpdump 是一个用来处理 RTMP 流媒体的开源工具包,支持 rtmp://, rtmpt://, rtmpe://, rtmpte://, and rtmps://. ...

  6. JavaScript内的类型转换

    JavaScript内的类型转换 1.分为自动转换和强制转换,我们一般用强制转换.其他类型转换为整数是parseInt();其他类型转化为小数parseFloat(); 2.判断是不是一个合法数字   ...

  7. HDU 1055 - Color a Tree

    一棵树,结点树为n,根结点为r.每个结点都有一个权值ci,开始时间为0,每染色一个结点需要耗时1,每个结点的染色代价为ci*ti(ti为当前的时间),每个结点只有在父结点已经被染色的条件下才能被染色. ...

  8. 鸟哥之安裝 CentOS7.x

    http://linux.vbird.org/linux_basic/0157installcentos7.php since 2002/01/01 新手建議 開始閱讀之前 網站導覽 Linux 基礎 ...

  9. 简单却又复杂的FizzBuzz面试编程问题

    写这篇文章主要是因为偶然看到一篇关于stackoverflow公司的面经中提到了一个有趣的面试编程问题,如题所述:FizzBuzz问题.原文引用如下: “在一些公平的考验之后,我发现那些因为代码而抓狂 ...

随机推荐

  1. #import 跟 #include、@class 之间的区别

    #include 是 C/C++ 导入头文件的关键字  是完整的包含某个文件的内容(包括该文件中被导入的文件) #import 是 OC 导入头文件的关键字 #import 指令是 OC 针对 #in ...

  2. 开发问题(C#)

    1. 重新引入dll文件之后,显示黄色感叹号,可能的原因:dll文件受损或者dll版本与工程Framework版本不一致. 2. 错误 232 无法将文件“..\SES.Common\bin\Debu ...

  3. 多媒体音频(audio)

    随着计算机技术的发展,特别是海量存储设备和大容量内存在PC机上的实现,对音频媒体进行数字化处理便成为可能.数字化处理的核心是对音频信息的采样,通过对采集到的样本进行加工,达成各种效果,这是音频媒体数字 ...

  4. JavaScript学习中的挑战

    当人们尝试学习 JavaScript , 或者其他编程技术的时候,常常会遇到同样的挑战: 有些概念容易混淆,特别是当你学习过其他语言的时候.很难找到学习的时间(有时候是动力).一旦当你理解了一些东西的 ...

  5. [原创]cocos2d-x研习录-第二阶 概念类之布场层类(CCLayer)

    上面说场景CCScene相当于一个大容器,那么布景层类CCLayer就是大容器里的若干个小容器.每个游戏场景CCScene会有很多层CCLayer,每一层CCLayer负责各自的任务.看一下CCLay ...

  6. ipod中,写计时器倒计时界面倒计时没有更改

    innerText 改为textContent. IE.Safari.Opera和Chrome支持innerText属性.Firefox虽然不支持innerText,但支持作用类似的textConte ...

  7. 封装对NPOIExcel的操作,方便的设置导出Excel的样式

    下载: http://pan.baidu.com/s/1boTpT5l 使用方法: 导入: 使用 ReadToDataTable方法 导出: NPOIExcel.ExcelManager manger ...

  8. apache-flume-1.5.0-bin windows

    1  testconsole.conf syslog-agent.sources = Syslogsyslog-agent.channels = MemoryChannel-1syslog-agent ...

  9. 干货:结合Scikit-learn介绍几种常用的特征选择方法

    原文  http://dataunion.org/14072.html 主题 特征选择 scikit-learn 作者: Edwin Jarvis 特征选择(排序)对于数据科学家.机器学习从业者来说非 ...

  10. js 实现ActiveXObject("Scripting.Dictionary") 功能

    /* 字典 ActiveXObject("Scripting.Dictionary") 项目中用到的ActiveXObject("Scripting.Dictionary ...