45.LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何。为了方便起见,你可以认为大小王是0。
function IsContinuous(numbers){
if(!numbers || numbers.length < 1){
return false;
}
var len = numbers.length;
numbers.sort(function(a,b){return a - b;});
var zeros = 0, gaps = 0;
for(var i = 0; i < len && numbers[i] == 0; i++){
zeros++;
}
var small = zeros, big = small + 1;
while(big < len){
if(numbers[small] == numbers[big]){
return false;
}
gaps += numbers[big] - numbers[small] - 1;
small = big++;
}
return gaps <= zeros;
}
46.每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)
function LastRemaining_Solution(n, m){
if(n < 1 || m < 1){
return -1;
}
var last = 0;
for(var i = 2; i <= n; i++){
last = (last + m) % i;
}
return last;
}
47.求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
function Sum_Solution(n){
var sum = 0;
plus(n);
return sum;
function plus(num){
sum += num;
num > 0 && plus(--num);
}
}
48.写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
function Add(num1, num2){
var sum, carry;
do{
sum = num1 ^ num2;
carry = (num1 & num2) << 1;
num1 = sum;
num2 = carry;
}while(num2 != 0);
return num1;
}
49.将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。数值为0或者字符串不是一个合法的数值则返回0
function StrToInt(str){
if(str.length === 0){
return 0;
}
var format = str.match(/^(\+?|-?)(\d+)$/);
if(!format){
return 0;
}
var num = 0;
var temp = format[2];
var base = 1;
var flag = format[1];
for(var i = temp.length - 1; i >= 0; i--){
num += parseInt(temp[i]) * base;
base *= 10;
}
return flag === '-' ? num * (-1) : num;
}
50.在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
function duplicate(numbers, duplication){
if(!numbers || !numbers.length){
return false;
}
var len = numbers.length;
for(var i = 0; i < len; i++){
var curr = numbers[i];
if(numbers.indexOf(curr) !== i){
duplication[0] = curr;
return true;
}
}
return false;
}
51.给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]A[1]...A[i-1]A[i+1]...A[n-1]。不能使用除法。
function multiply(array){
if(!array || !array.length){
return [];
}
var result = [];
var len1 = array.length, len2 = result.length;
result[0] = 1;
for(var i = 1; i < len1; i++){
result[i] = array[i - 1] * result[i - 1];
}
var temp = 1;
for(var i = len1 - 2; i >= 0;--i){
temp *=array[i + 1];
result[i] *= temp
}
return result;
}
52.请实现一个函数用来匹配包括'.'和''的正则表达式。模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(包含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配
function match(s, pattern)
{
if(s === "" && pattern === ""){
return true;
}
if(!pattern || pattern.length === 0){
return false
}
var reg = new RegExp('^' + pattern + '$');
return reg.test(s);
}
53.请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
function isNumeric(s){
var reg = /^[+-]?(?:(\d+)(\.\d+)?|(\.\d+))([eE][+-]?\d+)?$/;
return reg.test(s);
}
54.请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
function Init(){
streamNums = []; //定义一个全局变量, 不用var
streamNumsLen = 256; //定义一个全局变量, 不用var
streamNumsIndex = 0; //定义一个全局变量, 不用var
for(var i = 0; i < streamNumsLen; i++){
streamNums[i] = -1;
}
}
function Insert(ch){
var code = ch.charCodeAt();
if(streamNums[code] == -1){
streamNums[code] = streamNumsIndex;
} else if(streamNums[code] >= 0){
streamNums[code] = -2;
}
streamNumsIndex++;
}
function FirstAppearingOnce(){
result = '';
var ch = '';
var minIndex = Infinity;
for(var i = 0; i < streamNumsLen; i++){
if(streamNums[i] >= 0 && streamNums[i] < minIndex){
ch = String.fromCharCode(i);
minIndex = streamNums[i];
}
}
return ch == "" ? '#' : ch;
}
55.一个链表中包含环,请找出该链表的环的入口结点。
/*function ListNode(x){
this.val = x;
this.next = null;
}*/
function EntryNodeOfLoop(pHead){
if(!pHead){
return null;
}
var meeting = meetingNode(pHead);
if(!meeting){
return null;
}
var nodeLoop = 1;
var node1 = meeting;
while(node1.next != meeting){
node1 = node1.next;
nodeLoop++;
}
node1 = pHead;
for(var i = 0; i < nodeLoop; i++){
node1 = node1.next;
}
var node2 = pHead;
while(node1 != node2){
node1 = node1.next;
node2 = node2.next;
}
return node1;
function meetingNode(node){
if(!node || !node.next){
return null;
}
var slow = node.next;
var fast = slow.next;
while(fast && slow){
if(fast === slow){
return fast;
}
slow = slow.next;
fast = fast.next;
if(fast){
fast = fast.next;
}
}
return null;
}
}