热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【leetcode】solutioninjava——Easy1

转载请注明原文地址:http:www.cnblogs.comygj0930p6409067.html1:HammingdistanceTheHammin

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6409067.html

1:Hamming distance

The Hamming distance between two integers is the number of positions at which the corresponding bits are different.

Given two integers x and y, calculate the Hamming distance.

此题求汉明距离。学过计网都让应该都知道了,汉明距离就是两个二进制串异或的结果的1的个数。按此原理,我们可以直接求出x^y结果,然后遍历结果中1的个数。

而一个整数怎么遍历它的二进制串呢?用位运算中的右移,每次右移一位,和1取&即可。

public int hammingDistance(int x, int y) {int res&#61;0,xor&#61;x^y; for (int i &#61; 0; i <32; i&#43;&#43;) {res&#43;&#61;(xor&1);xor&#61;(xor>>1);} return res; }

 

2&#xff1a;Number Complement

Given a positive integer, output its complement number. The complement strategy is to flip the bits of its binary representation.

此题为求一个数的二进制表示除去前导零后部分按位取反。注意这里不是简单的求一个数的按位取反&#xff0c;因为这里是不算前导零部分的。简单的“~X”的结果是“-(X&#43;1)”&#xff0c;而这里不是。

解题思路是&#xff1a;把这个数从低位到高位遍历&#xff0c;每次右移1位&1得出当前位的数值&#xff0c;并且用index记录当前位下标。然后当前位置数值与1异或即实现“1变0&#xff0c;0变1”。最后&#xff0c;把01互换后的数值左移回index位即得当前位乘以权重是多少&#xff0c;加到res中。直到除去前导零的部分全部遍历完&#xff0c;res即为所求结果。这里判断遍历完的思路是&#xff1a;tempnum&#61;0。因为每遍历一位右移1&#xff0c;所以遍历完后剩下前导零&#xff0c;当前数值为0.

public int findComplement(int num) {int index&#61;0;int res&#61;0;int tempnum&#61;num;int curr;while(tempnum>0){curr&#61;(tempnum&1)^1;res&#43;&#61;(curr<<index);tempnum&#61;tempnum>>1;&#43;&#43;index;}return res;}

 3&#xff1a;Keyboard Row

Given a List of words, return the words that can be typed using letters of alphabet on only one row&#39;s of American keyboard like the image below.

此题为&#xff1a;输入一个字符串数组&#xff0c;要求输出这个数组中能够在美式键盘同一行打出的元素。比如  dad  的字符都在键盘同一行&#xff0c;hello不是。所以dad满足要求。

思路&#xff1a;我的思路是&#xff0c;键盘三行&#xff0c;一行保存为一个字符串。然后对于输入的字符串数组进行遍历。对于当前元素的第一个字母&#xff0c;在键盘三个字符串中indexOf(ch)得出第一个字母在哪一行。然后&#xff0c;就在这一行字符串逐个indexOf()剩下的字母&#xff0c;如果有一个找不到&#xff0c;则说明跨行了。否则&#xff0c;把这个元素添加到list中。直到输入的字符串数组所有元素遍历完&#xff0c;把list转换为String[]返回即可。

public String[] findWords(String[] words) {String[] lines&#61;{"QWERTYUIOP","ASDFGHJKL","ZXCVBNM"}; List res&#61;new ArrayList(); for(String word:words){char[] chars&#61;word.toUpperCase().toCharArray(); int lineindex&#61;-1;boolean flag&#61;true;for(int i&#61;0;i<3;&#43;&#43;i){if(lines[i].indexOf(chars[0])>&#61;0){lineindex&#61;i; break;}}for(int i&#61;1;ii){if(lines[lineindex].indexOf(chars[i])<0){flag&#61;false;break;} }if(flag){res.add(word);}}
//这里注意List转换为String数组是通过 list.toArray(new String[0])实现的
return res.toArray(new String[0]); }

    有一种做法更优化&#xff0c;使用了HashMap&#xff0c;把每一行字符保存到一个map中&#xff0c;同一行的拥有同一value值。然后同样&#xff0c;也是遍历输入的字符串数组的元素的每一个字母&#xff0c;获取他们的行值。有一个行值与前面不同就说明跨行。  

public class Solution { public String[] findWords(String[] words) { String[] strs &#61; {"QWERTYUIOP","ASDFGHJKL","ZXCVBNM"}; Map map &#61; new HashMap<>(); for(int i &#61; 0; i){ for(char c: strs[i].toCharArray()){ map.put(c, i);} } List res &#61; new LinkedList<>(); for(String w: words){ if(w.equals("")) continue; int index &#61; map.get(w.toUpperCase().charAt(0)); for(char c: w.toUpperCase().toCharArray()){ if(map.get(c)!&#61;index){ index &#61; -1;break; } } if(index!&#61;-1) res.add(w);} return res.toArray(new String[0]); }
}

 4&#xff1a;Next Greater Element I

You are given two arrays (without duplicates) nums1 and nums2 where nums1’s elements are subset of nums2. Find all the next greater numbers for nums1&#39;s elements in the corresponding places of nums2.

The Next Greater Number of a number x in nums1 is the first greater number to its right in nums2. If it does not exist, output -1 for this number.

此题&#xff1a;给出两个数组nums1和nums2&#xff0c;nums1为nums2的子集。然后对于nums1中每个元素&#xff0c;找出其在nums2中紧随其后的第一个大于它的数值。有则返回该数值&#xff0c;无则返回-1。

思路&#xff1a;用嵌套循环&#xff0c;外层循环遍历nums1&#xff0c;内层循环遍历nums2&#xff0c;满足条件  nums2[i]>j并且i>j的下标即得nums2中大于j并且下标大于j的数&#xff0c;而在第一次获得该数时就break即可得到紧随其后的第一个大于j的值。

public int[] nextGreaterElement(int[] findNums, int[] nums) {List res&#61;new ArrayList(); for(int j:findNums){int greater&#61;-1;int jindex&#61;nums.length;for(int i&#61;0;ii){if(nums[i]&#61;&#61;j){jindex&#61;i;}if((nums[i]>j)&&(i>jindex)){greater&#61;nums[i];break;}}res.add(greater);}int[] result&#61;new int[res.size()];for(int i&#61;0;ii){result[i]&#61;(Integer) res.get(i);}return result;}

    上面做法浪费的地方在于&#xff0c;每次内层循环需要从nums2的0左边开始遍历&#xff0c;浪费时间。如果可以每次直接从nums2中的nums1元素值处开始遍历&#xff0c;直接找第一个大于它的值&#xff0c;就会快很多。这种把值与下标记录下来以免每次都需要遍历一次找下标的优化方法就是——使用map。

public int[] nextGreaterElement(int[] findNums, int[] nums) {int[] result&#61;new int[findNums.length];//首先&#xff0c;用一个map把nums的数值与下标记录下来Map map&#61;new HashMap();for(int i&#61;0;ii){map.put(nums[i], i);} for(int i&#61;0;ii){//在遍历findnums的元素时&#xff0c;直接通过map.get(key)找到nums中相应元素的下标作为遍历nums的起始位置int startindex&#61;map.get(findNums[i]);for(int j&#61;startindex;jj){if(nums[j]>findNums[i]){result[i]&#61;nums[j];break;} result[i]&#61;-1;} }return result;}

    还有一种做法相当于记忆化搜索。先由nums2&#xff0c;用一个map把num2每一个元素的与紧随其后的第一个大于它的值建立起映射。无则不管。然后&#xff0c;在遍历nums1时&#xff0c;直接由这个map去get(key)获取第一个大于它的数值即可。有则返回数值&#xff0c;无则返回空&#xff0c;则我们返回-1。

public int[] nextGreaterElement(int[] findNums, int[] nums) {int[] result&#61;new int[findNums.length];Stack stack&#61;new Stack();Map map&#61;new HashMap();//逐个把nums入栈&#xff0c;并且从第二个起&#xff0c;逐个与栈顶元素比较&#xff0c;大于它则说明此数为第一个大于栈顶元素的值&#xff0c;记录到map去&#xff0c;并把栈顶弹出。否&#xff0c;则把这个元素入栈。遍历下一个for(int num:nums){//对当前nums元素&#xff0c;用一个while处理栈中待处理的元素们&#xff1a;栈顶<当前元素&#xff0c;则记录到map并弹出。此时若栈未空&#xff0c;且栈顶继续<当前nums元素&#xff0c;则继续记录到mapwhile(!stack.empty() && stack.peek()<num){map.put(stack.pop(), num);}//把当前元素入栈&#xff0c;在之后的循环中寻找大于它的元素
stack.push(num);} for(int i&#61;0;ii){result[i] &#61; map.get(findNums[i])&#61;&#61;null?-1:map.get(findNums[i]);}return result;}

 5:Fizz Buzz

Write a program that outputs the string representation of numbers from 1 to n.But for multiples of three it should output “Fizz” instead of the number and for the multiples of five output “Buzz”. For numbers which are multiples of both three and five output “FizzBuzz”.

此题&#xff1a;写一个程序打印1到100这些数字。但是遇到数字为3的倍数的时候&#xff0c;打印“Fizz”替代数字&#xff0c;5的倍数用“Buzz”代替&#xff0c;既是3的倍数又是5的倍数打印“FizzBuzz”。

思路&#xff1a;此题&#xff0c;若用暴力法的话就太不明智了。因为n大小没定&#xff0c;如果从1到n逐个遍历都对3、5取余的话耗时太多太多了。我的做法是&#xff0c;借助上一题的灵感&#xff1a;首先由n求出1~nz之间3、5的倍数们&#xff0c;并用两个map记录下来。然后在遍历1~n时&#xff0c;只需分别从map3/map5去get(i)&#xff0c;有的对象返回则说明i为 3/5的倍数&#xff0c;分4种组合情况&#xff0c;用if-else if语句分别处理即可。

public List fizzBuzz(int n) {List resList&#61;new ArrayList();//求出n之内3、5的最大倍数int times_of_three&#61;(int) Math.floor(n/3);int times_of_five&#61;(int) Math.floor(n/5);//把1~n的3、5倍数值放到map里Map map3&#61;new HashMap();Map map5&#61;new HashMap(); for(int i&#61;1;i<&#61;times_of_three;&#43;&#43;i){map3.put(3*i, i);}for(int i&#61;1;i<&#61;times_of_five;&#43;&#43;i){map5.put(5*i, i);}//遍历1~n。对每个i分4种情况处理for(int i&#61;1;i<&#61;n;&#43;&#43;i){if(map3.get(i)!&#61;null && map5.get(i)!&#61;null){resList.add("FizzBuzz");}else if (map3.get(i)!&#61;null && map5.get(i)&#61;&#61;null) {resList.add("Fizz");}else if (map3.get(i)&#61;&#61;null && map5.get(i)!&#61;null) {resList.add("Buzz");}else{resList.add(""&#43;i);} } return resList; }

还有一种方法&#xff0c;是用步长取代求余。思路可借鉴博客&#xff1a;http://blog.csdn.net/ixidof/article/details/7697173

 



推荐阅读
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • QuestionThereareatotalofncoursesyouhavetotake,labeledfrom0ton-1.Somecoursesmayhaveprerequi ... [详细]
  • 基于词向量计算文本相似度1.测试数据:链接:https:pan.baidu.coms1fXJjcujAmAwTfsuTg2CbWA提取码:f4vx2.实验代码:imp ... [详细]
author-avatar
陈俊铭冠萍育维
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有