java&python版剑指offer(三)

本文按照牛客网的顺序,牛客网剑指offer刷题网址:https://www.nowcoder.com/ta/coding-interviews

本篇涉及的题目有:
1、二进制中1的个数
2、链表中的倒数第K个节点
3、反转链表
4、合并两个排序的链表
5、树的子结构
6、二叉树的镜像

1、二进制中1的个数

问题描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

思路解析
考虑二进制1100,减1之后变为1011 1100&1011 为 1000,也就是说n和n-1的与运算,结果是将n的最后一位变成了0

代码实现
java

public class Solution {
    public int NumberOf1(int n) {
              int count = 0;
      while (n!=0)
      {
            ++ count;
            n = (n - 1) & n;
      }
      return count;
    }
}

python

def NumberOf1( n):
    # write code here
    count = 0
    while n:
        n = (n - 1) & n
        count = count + 1
    return count

2、链表中的倒数第K个节点

问题描述
输入一个链表,输出该链表中倒数第k个结点。

思路解析
假设链表中的节点数大于等于k个,那么一定会存在倒数第k个节点,那么我们首先使用一个快指针往前走k步,然后使用一个慢指针随快指针一起每次往前走一步,两个指针之间始终有k的距离,当快指针走到末尾变为Null时,慢指针所在的位置就是倒数第k个节点。

代码实现
java

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        if(head==null)
            return null;
        ListNode fast = head;
        int t = 0;
        while(fast != null && t < k){
            t += 1;
            fast = fast.next;
        }
        if (t < k)
            return null;
        ListNode slow = head;
        while (fast != null){
            fast = fast.next;
            slow = slow.next;
        }
        return slow;
    }
}

python

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def FindKthToTail(self, head, k):
        # write code here
        if not head or k<=0:
            return None
        p = head
        t = 0
        while p!=None and t<k:
            p = p.next
            t = t + 1
        # 判断有没有k个节点
        if t < k:
            return None
        q = head
        while p!=None:
            p = p.next
            q = q.next
        return q
        

3、反转链表

问题描述
输入一个链表,反转链表后,输出链表的所有元素。

思路解析
从根节点开始,利用头插法将链表进行反转

代码实现
java

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode ReverseList(ListNode head) {
        if(head == null)
            return null;
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode p = head;
        ListNode q = p;
        while(p!=null){
            q = p.next;
            p.next = dummy.next;
            dummy.next = p;
            p = q;
        }
        head.next = null;
        return dummy.next;
    }
}

python

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    # 返回ListNode
    def ReverseList(self, pHead):
        # write code here
        if not pHead:
            return None
        dummy = ListNode(-1)
        dummy.next = pHead
        p = pHead.next
        
        while p!=None:
            q = p
            p = p.next
            q.next = dummy.next
            dummy.next = q
        pHead.next = None
        return dummy.next

4、合并两个排序的链表

问题描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

思路解析
利用两个指针分别指向两个链表。

代码实现
java

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        ListNode dummy = new ListNode(-1);
        ListNode p1 = list1;
        ListNode p2 = list2;
        ListNode q = dummy;
        while(p1 != null && p2 != null){
            if (p1.val < p2.val){
                q.next = p1;
                p1 = p1.next;
            }
            else{
                q.next = p2;
                p2 = p2.next;
            }
            q = q.next;
        }
        while(p1!=null){
            q.next = p1;
            q = q.next;
            p1 = p1.next;
        }
        while(p2!=null){
            q.next = p2;
            q = q.next;
            p2 = p2.next;
        }
        return dummy.next;
    }
}

python

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    # 返回合并后列表
    def Merge(self, pHead1, pHead2):
        # write code here
        dummy = ListNode(-1)
        q = dummy
        p1 = pHead1
        p2 = pHead2
        while p1 and p2:
            if p1.val <= p2.val:
                q.next = p1
                q = p1
                p1 = p1.next
            else:
                q.next = p2
                q = p2
                p2 = p2.next
        if p1:
            q.next = p1
        if p2:
            q.next = p2
        return dummy.next

5、树的子结构

问题描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

思路解析
采用递归的思路,单独定义一个函数判断B是不是从当前A的根节点开始的子树,这里判断是不是子树也需要一个递归的判断。如果是,则返回True,如果不是,再判断B是不是从当前A的根节点的左子节点或右子节点开始的子树。

代码实现
java

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        if(root1 == null || root2 == null)
            return false;
        boolean result = false;
        if (root1.val == root2.val)
            result = isSubTree(root1,root2);
        if(!result)
            result = HasSubtree(root1.left,root2);
        if(!result)
            result = HasSubtree(root1.right,root2);
        return result;
    }
    
    public boolean isSubTree(TreeNode root1,TreeNode root2){
        if(root2==null)
            return true;
        if(root1==null)
            return false;
        if(root1.val != root2.val)
            return false;
        return isSubTree(root1.left,root2.left) && isSubTree(root1.right,root2.right);
    }
}

python

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def HasSubtree(self, pRoot1, pRoot2):
        # write code here
        if not pRoot2 or not pRoot1:
            return False
        result = False
        if pRoot1.val == pRoot2.val:
            result = self.isSubTree(pRoot1,pRoot2)
        if not result:
            result = self.HasSubtree(pRoot1.left,pRoot2)
        if not result:
            result = self.HasSubtree(pRoot1.right,pRoot2)
        return result
    def isSubTree(self,pRoot1,pRoot2):
        if not pRoot2:
            return True
        if not pRoot1:
            return False
        if pRoot1.val != pRoot2.val:
            return False
        return self.isSubTree(pRoot1.left,pRoot2.left) and self.isSubTree(pRoot1.right,pRoot2.right)
        
        

6、二叉树的镜像

问题描述
题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述:
二叉树的镜像定义:源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5
思路解析
利用递归的思路,每次对换传入的根节点的左右子树即可。

代码实现
java

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public void Mirror(TreeNode root) {
        if(root == null)
            return;
        TreeNode temp = root.right;
        root.right = root.left;
        root.left = temp;
        Mirror(root.left);
        Mirror(root.right);
    }
}

python

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回镜像树的根节点
    def Mirror(self, root):
        # write code here
        if not root:
            return None
        # 要保存下来,要不没用
        p = root.left
        root.left = self.Mirror(root.right)
        root.right = self.Mirror(p)
        return root
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 4,432评论 1 31
  • 说明: 本文中出现的所有算法题皆来自牛客网-剑指Offer在线编程题,在此只是作为转载和记录,用于本人学习使用,不...
    秋意思寒阅读 1,145评论 1 1
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 5,073评论 0 12
  • 去五妹家玩 2010-12-01 16:43 阅读(20)评论(4) 早晨还没起床,五妹就来了电话,说叫我去玩。我...
    零星往事阅读 195评论 0 0
  • 问题一:梳理你现阶段使用的手机产品的亮点(或是为什么会选择购买这款手机) 正在使用的手机:三星(对,这个16年以爆...
    皮卡皮卡莹阅读 274评论 0 0