前言
又是每日一刷,既然没人看那我就开启自嗨式写法。
JZ11 二进制中1的个数
题目
输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
解法
顺便复习下如何用js十进制转二进制:
parseInt(n).toString(2)
这题一开始也挺蒙的,后面看了高人指点,能够领略一二,有种玩数竞的感觉。
1100 减去1后 -》1011.
可以发现减1的结果是把最右边的一个1开始的所有位都取反了。
这个时候如果我们再把原来的整数和减去1之后的结果做与运算:1100&1011=1000.
也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.
那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。
function NumberOf1(n)
{
// write code here
var count = 0;
while(n)
{
n = n & (n-1);
count++;
}
return count;
}
JZ12 数值的整数次方
题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
答案
解法一
pow函数的简单实现
/**
* @return {number}
*/
function Power(base, exponent) {
// write code here
if (exponent === 0) {
return 1;
} else if (exponent === 1) {
return base;
}
let ret = base;
if (exponent > 0) {
for (let i = 1; i < exponent; i++) {
ret *= base;
}
return ret;
} else {
for (let i = 1; i < Math.abs(exponent); i++) {
ret *= base;
}
return 1 / ret;
}
}
解法二
应用ES6最新运算符 **
function Power(base, exponent)
{
// write code here
return base**exponent;
}
JZ13 调整数组顺序使奇数在偶数前面
题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
解法一
开两个数组分别记录
function reOrderArray(array)
{
let oddArray = [];
let evenArray = [];
for(let i = 0; i < array.length; i++)
{
if(array[i]%2 === 0){
evenArray.push(array[i]);
}else{
oddArray.push(array[i]);
}
}
return oddArray.concat(evenArray);
}
解法二
相当于一个特殊条件判断的插入排序.是奇数的话把他插入到前面,其余数字后移
function reOrderArray2(array) {
let k = 0;
for(let i = 0; i < array.length; i++)
{
let tmp = array[i];
if(tmp & 1){//是奇数
for(let j = i - 1; j >= k; j--)//到已经排序好的为止
{
array[j+1] = array[j];
}
array[k++] = tmp;
}
}
return array;
}
console.log(reOrderArray2([1,2,3,4,5,6]))
JZ14 链表中倒数第k个节点
题目描述
输入一个链表,输出该链表中倒数第k个结点。
解法
快慢指针,相距k个,那么快指针到末尾时,慢指针的位置便是倒数k个
function FindKthToTail(head, k) {
if (!head || k < 1) return null;
let slowptr = head;
let fastptr = head;
let count = 0;
while (fastptr != null && count < k) {
count++;
fastptr = fastptr.next;
}
if (count < k) return null;//k的取值超过了链表本身的长度
while (fastptr != null) {
fastptr = fastptr.next;
slowptr = slowptr.next;
}
return slowptr;
}
JZ15 反转链表
题目描述
输入一个链表,反转链表后,输出新链表的表头。
解答
基本思路,保存当前指针.next.next,再将当前指针.next指向当前指针,然后前移
function ReverseList(pHead) {
// write code here
if (!pHead) return null;
if (!pHead.next) return pHead;
let p1 = pHead;
let p2 = pHead.next;
p1.next = null;
let temp;
while (p2 != null) {
temp = p2.next;
p2.next = p1;
p1 = p2;
p2 = temp;
}
return p1;
}