46题解–孩子们的游戏
题目描述
每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!_)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)
如果没有小朋友,请返回-1
思路解析
这题的本质其实是契科夫圆,有兴趣的大家可以去了解一下,这里博主是通过单链表实现的,其实很简单就是每一个轮回计数,当达到m时,就刨除相应位置的元素,如果计数的次数已经超过链表的长度,那么我们就需要通过%这个操作重新将计数归为从1开始,一直这样递归,知道链表只剩下一个元素。
源代码
import java.util.ArrayList; public class Solution { public int LastRemaining_Solution(int n, int m) { if(n==0) return -1; ArrayList<Integer>list=new ArrayList<Integer>(); for(int i=0;i<n;i++) list.add(i); int count=0; while(list.size()>1) { for(int i=0;i<m;i++) { count++; if(count>list.size()) { count%=list.size(); } } //注意这里因为是下标,所以我们必须要进行--操作,而且必须是--count不能用count--,否则还是会报越界错误 list.remove(--count); } return list.get(0); } }
47题解–求1+2+3+。。。。+n的和
题目描述
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
思路解析
这里主要是运用了短路原理。其实大家看看应该就能理解,如果是第一次接触
源代码
public class Solution { public int Sum_Solution(int n) { int sum=n; boolean flag=(sum>0)&&((sum+=Sum_Solution(n-1))>0); return sum; } }
48题解–不用加减乘除做加法
题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
思路解析
这里主要是运用了位求和以及进位的操作
我们先通过10进制来跟大家演示一下
假设我们计算36+19,我们就按照下面的图来皆是:
同样的这样的运算是否也适用于二进制呢,我们同样来试试:
19=10011
35=100011
显然计算下来也是符合我们的规则的,所以我们也可以通过这种方式来计算。
其次我们只要在观察得出位求和与进位操作分别有什么规律?
所以我们就可以通过异或和与操作来帮助我们更快的进行操作。
源代码
public class Solution { public int Add(int num1,int num2) { int sum,carry; do{ sum = num1 ^ num2; carry = (num1&num2) <<1; num1 = sum; num2 = carry; }while(num2!=0); return num1; } }
49题解–把字符串转换成整数
题目描述
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
思路解析
这里我们先判断当前的字符是不是一个数,这里因为他可能会带上符号,所以我们需要将第一个位置的字符单独拿出来讨论。
谈论完成后只需要将是数字字符的部分整合成数字输出即可。
源代码
import java.util.ArrayList; import java.util.List; public class Solution { public boolean panduan(String str) { if(str.equals("")) return false; char[]ch=str.toCharArray(); if(!((ch[0]>='0'&&ch[0]<='9')||ch[0]=='+'||ch[0]=='-')) return false; for(int i=1;i<ch.length;i++) { if(!(ch[i]>='0'&&ch[i]<='9')) return false; } return true; } public int StrToInt(String str) { if(panduan(str)) { int sum=0; int count=1; if(str.charAt(0)=='+') { String str1=str.substring(1,str.length()); char[]ch=str1.toCharArray(); List<Integer>list=new ArrayList<Integer>(); for(int i=ch.length-1;i>-1;i--) list.add(Character.getNumericValue(ch[i])); for(int i=0;i<list.size();i++) { sum+=list.get(i)*count; count*=10; } return sum; } else if(str.charAt(0)=='-') { String str1=str.substring(1,str.length()); char[]ch=str1.toCharArray(); List<Integer>list=new ArrayList<Integer>(); for(int i=ch.length-1;i>-1;i--) list.add(Character.getNumericValue(ch[i])); for(int i=0;i<list.size();i++) { sum+=list.get(i)*count; count*=10; } return 0-sum; } else { char[]ch=str.toCharArray(); List<Integer>list=new ArrayList<Integer>(); for(int i=ch.length-1;i>-1;i--) list.add(Character.getNumericValue(ch[i])); for(int i=0;i<list.size();i++) { sum+=list.get(i)*count; count*=10; } return sum; } } else return 0; } }
50题解–数组中重复的数字
题目描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
思路解析
这题比较简单循环加入列表中,列表中不存在的就直接添加,如果列表已经存在,那么说明已经是重复的元素,跳出循环输出即可。
源代码
import java.util.ArrayList; import java.util.List; public class Solution { // Parameters: // numbers: an array of integers // length: the length of array numbers // duplication: (Output) the duplicated number in the array number,length of duplication array is 1,so using duplication[0] = ? in implementation; // Here duplication like pointor in C/C++, duplication[0] equal *duplication in C/C++ // 这里要特别注意~返回任意重复的一个,赋值duplication[0] // Return value: true if the input is valid, and there are some duplications in the array number // otherwise false public boolean duplicate(int numbers[],int length,int [] duplication) { boolean flag=false; List<Integer>list=new ArrayList<Integer>(); if(numbers==null){} else { list.add(numbers[0]); for(int i=1;i<length;i++) { if(!list.contains(numbers[i])) list.add(numbers[i]); else { duplication[0]=numbers[i]; flag=true; break; } } } return flag; } }