题目描述
随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!_)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)
分析:约瑟夫环问题,使用数组或者链表模拟一个环即可。
import java.util.ArrayList;
public class Solution {
public int LastRemaining_Solution(int n, int m) {
//防御
if(n<=0||m<=0){
return -1;
}
ArrayList<Integer> list=new ArrayList<>();
//模拟环以及数
int index=0;
for(int i=0;i<n;i++){
list.add(i);
}
//轮流删除
while(list.size()>1){
index=(index+m-1)%list.size();
list.remove(index);
}
return list.get(0);
}
}
题目描述
求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;
//n>0作为递归的边界条件
boolean flag = (n>0) && ((sum+=Sum_Solution(n-1))>0);
return sum;
}
}
题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
分析:将数转换为二进制思考,进位的时候:两个数对应的位置相等,那么此位的数可以向上一位进位(使用&运算求出);那么进位后剩余的呢:使用亦或求出不相同的位,直到某一个数为0
public class Solution {
public int Add(int num1,int num2) {
while(num2!=0){
//剩余的
int temp=num1^num2;
//进位的
num2=(num1&num2)<<1;
num1=temp;
}
return num1;
}
}
题目描述
将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
分析:字符串遍历处理即可,判断是否合法
public class Solution {
public int StrToInt(String str) {
if(str==null||"".equals(str)){
return 0;
}
boolean neg=false;
int i=0;
//判断+,-或者没有符号开始
char[] cs=str.toCharArray();
if(cs[0]=='-'){
neg=true;
i=1;
}else if(cs[0]=='+'){
i=1;
}
//防止溢出
long res=0;
for(;i<cs.length;i++){
if(cs[i]<'0'||cs[i]>'9'){
return 0;
}
res=res*10+cs[i]-'0';
}
if(neg){
res=-res;
}
return res<Integer.MIN_VALUE||res>Integer.MAX_VALUE ? 0 : (int)res;
}
}