function LastRemaining_Solution(n, m)
{
if (n===0) {
return -1;
}
if (n===1) {
return 0;
}
return (LastRemaining_Solution(n-1,m)+m)%n;
}
2、题目描述
function Sum_Solution(n)
{
if (n===1) {
return 1;
}
return Sum_Solution(n-1)+n;
}
3、题目描述
function Add(num1, num2)
{
var a=num1^num2;
var b=(num1&num2)<<1;
while (b) {
num1=a;
num2=b;
a=num1^num2;
b=(num1&num2)<<1;
}
return a;
}
4、题目描述
function StrToInt(str)
{
if (str.length===0) {
return 0;
}
var reg=/^(\+|-)?(\d+)$/;
var match=str.match(reg);
if (!match) {
return 0;
}
var num=parseInt(match[0],10);
if (!num) {
return 0;
}
return num;
}
5、题目描述
function duplicate(numbers, duplication)
{
// write code here
//这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
//函数返回True/False
if (numbers.length===0) {
return false;
}
for(var i=0;i
6、题目描述
function multiply(array)
{
if (array.length===0) {
return [];
}
var arrB=[];
for(var i=0;i
7、题目描述
function match(s, pattern)
{
var reg=new RegExp("^"+pattern+"$");
return reg.test(s);
}
注意:此处不可用reg="/^"+pattern+"$/",因为这样得到的reg是一个字符串,而字符串是没有test方法的;我们需要得到的是一个正则对象,像这样reg=new RegExp("^"+pattern+"$")才是。
function isNumeric(s)
{
var reg=/^(\+|-)?(\d+)?(\.?\d+)?((e|E)(\+|-)?\d+)?$/;
return reg.test(s);
}
9、题目描述
function Init()
{
this.obj={};
this.Insert=Insert;
this.FirstAppearingOnce=FirstAppearingOnce;
}
//Insert one char from stringstream
function Insert(ch)
{
if(!this.obj[ch]){
this.obj[ch]=1;
}else{
this.obj[ch]++;
}
}
//return the first appearence once char in current stringstream
function FirstAppearingOnce()
{
for(var attr in obj){
if(obj[attr]==1){
return attr;
}
}
return "#";
}
10、题目描述
function ListNode(x){
this.val = x;
this.next = null;
}
function EntryNodeOfLoop(pHead)
{
if (!pHead||!pHead.next) {
return null;
}
var arr=[];var index=0;
while (pHead) {
arr.push(pHead);
pHead=pHead.next;
index=arr.indexOf(pHead);
if (index!=-1) {
return arr[index];
}
arr.push(pHead);
pHead=pHead.next;
}
return null;
}
思路:将节点添加到数组中,然后在数组中查找当前节点的下一个节点,如果找到了,则找到的这个节点就是环的入口;如果没找到返回null。
function ListNode(x){
this.val = x;
this.next = null;
}
function deleteDuplication(pHead)
{
if(pHead===null){
return null;
}
if(pHead!==null&&pHead.next===null){
return pHead;
}
let first={ val:-1,next:pHead },
cur=pHead,
pre=first;
first.next=pHead;
while(cur!==null&&cur.next!==null){
if(cur.val===cur.next.val){
let val=cur.val;
while(cur!==null&&cur.val===val){
cur=cur.next;
pre.next=cur;
}
}else{
pre=cur;
cur=cur.next;
}
}
return first.next;
}
12、题目描述
function TreeLinkNode(x){
this.val = x;
this.left = null;
this.right = null;
this.next = null;
}
function GetNext(pNode)
{
if(pNode==null){
return null;
}
//1 节点右孩子存在,找右孩子结点的左节点
if(pNode.right!=null){
var p=pNode.right;
while(p.left!=null){
p=p.left;
}
return p;
}
//2当前节点是父节点的第一个左节点并且该节点没有右子树
while(pNode.next!=null){
if(pNode==pNode.next.left){
return pNode.next;
}
pNode=pNode.next;
}
return null;
}
13、题目描述
function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
}
function isSymmetrical(pRoot)
{
if(pRoot==null){
return true;
}
return Symmetrical(pRoot.left,pRoot.right);
}
function Symmetrical(left,right){
if(left==null&&right==null){
return true;
}
if(left!=null&&right!=null){
if(left.val==right.val){
return Symmetrical(left.left,right.right)&&Symmetrical(left.right,right.left);
}
}
}
14、题目描述
function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
}
function Print(pRoot)
{
if(!pRoot){
return [];
}
var que=[],res=[],arr=[];
var temp=0,count=1,level=0;
que.push(pRoot);
while(que.length){
var p=que.shift();
count--;
arr.push(p.val);
if(p.left){
que.push(p.left);
temp++;
}
if(p.right){
que.push(p.right);
temp++;
}
if(count==0){
count=temp;
temp=0;
level++;
if(level%2==0){
arr.reverse();
}
res.push(arr);
arr=[];
}
}
return res;
}
思路:层次遍历,将当前节点如队,队头出队添加到数组,如果队头有左孩子节点,将其入队;如果有右孩子结点,将其入队。队不空时循环出队。
function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
}
function Print(pRoot)
{
if(!pRoot){
return [];
}
var que=[],res=[],arr=[];
var temp=0,count=1;
que.push(pRoot);
while(que.length){
var p=que.shift();
count--;
arr.push(p.val);
if(p.left){
que.push(p.left);
temp++;
}
if(p.right){
que.push(p.right);
temp++;
}
if(count==0){
count=temp;
temp=0;
res.push(arr);
arr=[];
}
}
return res;
}
说明:类似上题。
function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
}
var arr=[];
function Serialize(pRoot)
{
if (!pRoot) {
arr.push('#');
return;
}
arr.push(pRoot.val);
Serialize(pRoot.left);
Serialize(pRoot.right);
}
function Deserialize()
{
if (!arr) {
return null;
}
var temp=arr.shift();
if (typeof temp=='number') {
var root=new TreeNode(temp); //创建节点
root.left=Deserialize();
root.right=Deserialize();
}
return root;
}
17、题目描述
function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
}
function KthNode(pRoot, k)
{
if (pRoot==null) {
return null;
}
var arr=[];
midSort(pRoot);
if (k>arr.length) {
return null;
}
return arr[k-1];
function midSort(pRoot){
if (pRoot) {
midSort(pRoot.left);
arr.push(pRoot);
midSort(pRoot.right);
}
}
}
思路:中序遍历二叉排序树的结果刚好是非递减顺序。
var arr=[];
function Insert(num)
{
arr.push(num);
arr.sort();
}
function GetMedian(){
if (!arr) {
return null;
}
if (arr.length%2==1) {
return arr[parseInt(arr.length/2)];
}else{
return (arr[parseInt(arr.length/2)]+arr[parseInt(arr.length/2)-1])/2;
}
}
说明:记得排序哟,也要记得parseInt取整哟!
function maxInWindows(num, size)
{
if (!num||!size||size>num.length) {
return [];
}
var res=[];
for(var i=0;i+size<=num.length;i++){
var arr=num.slice(i,i+size);
res.push(Math.max(...arr));
}
return res;
}
20、题目描述
【回溯法典型案例】
function hasPath(matrix, rows, cols, path)
{
if (!path) {
return true;
}
var visited=[];
for(var i=0;i=0&&col=0&&visited[row][col]===false) {
if(matrix[row*cols+col]===path[pathIndex]) {
visited[row][col]=true;
if(pathIndex===path.length-1) {
pathFlag=true;
}else{
pathFlag=hasPathCore(matrix,rows,cols,row-1,col,path,pathIndex+1,visited)||
hasPathCore(matrix,rows,cols,row+1,col,path,pathIndex+1,visited)||
hasPathCore(matrix,rows,cols,row,col-1,path,pathIndex+1,visited)||
hasPathCore(matrix,rows,cols,row,col+1,path,pathIndex+1,visited);
if(!pathFlag) { //防止当在矩阵中定位了路径中前n个字符的位置之后,在与第n个字符对应的格子的周围都没有找到第n+1个字符,这个时候只要在路径上回到第n-1个字符,重新定位第n个字符。
visited[row][col] = false; //此时将已经改为true的节点改回false
}
}
}
}
return pathFlag;
}
21、题目描述【回溯法典型案例】
答案:
function movingCount(threshold, rows, cols)
{
if (!threshold) {
return 1;
}
var visited=[];
for(var i=0;i=0&&col=0&&visited[row][col]===false&&getSum(row,col)<=k) {
visited[row][col]=true;
temp=1+getMoved(rows,cols,row-1,col,visited,k)+
getMoved(rows,cols,row+1,col,visited,k)+
getMoved(rows,cols,row,col-1,visited,k)+
getMoved(rows,cols,row,col+1,visited,k);
}
return temp;
}