面试题算法题总结 二

字符串处理

给定一个字符串,找到最长子字符串的长度,要求子字符串中所有字符不重复。
Example:
Input: “abcabcbb”
Output: 3
Explanation: 满足条件的最长子字符串为 “abc”, 长度为3.

使用暴力破解法,这是一种比较容易理解的方法,但是执行效率偏低
 - 思路是我们遍历整个字符串,依次找出所有符合条件的字串,
 - 找到满足条件的最大长度的字串
 - 判断字串中元素是否重复,可以对这个元素放入字串循环判断,也可以使用set集合
 
 def computeSubString(s):
     # 定义2个set集合,用于判断元素是否重复
     subSet = set([])
     curSet = set([])
     max = 0 # 用于纪录每次比较得出的最大长度
     for i in range(len(s)):
         # 循环遍历s中所有可能的字串,步长为1
         # 每遍历一次,都需要给存贮字串的set集合重新赋值
         subSet = set([s[i]])
         curSet = set([s[i]])
         # 从i的后一位开始检索字串
         for j in range(i+1,len(s)):
             subSet.add(s[j])
             # 如果s[j]不重复,添加成功,进入if,否则break
             if len(subSet) > len(curSet):
                  curSet.add(s[j])
            else:
                 break
         # 纪录下此时的最大值
         if len(curSet) > max:
             max = len(curSet)
    return max
 
 
 if __name__ == '__main__':
     print(computeSubString('abcabcbb')) # 3

链表

有两个有序链表A和B,合并A和B成为一个新的有序列表C,并去除其中的重复元素。尽量不要开辟新的存储空间,时间复杂度O(n)。

思路:
- 既然是有序列表,先合并两个列表中的数值较小的列表,在合并过程中,使用set判断元素是否会重复,一直合并到较小的那一方没有元素为止,假设合并之后的列表为列表C。
- 然后对于剩下的那一方较大的链表,判断其元素是否重复,将其不重复的元素添加到列表C中,完成最后合并

# 定义链表
class ListNode(object):
    def __init__(self,x):
        self.val = x
        self.next = None
        
class Merge(object):
    def __init__(self):
        # 用于判断元素是否重复
        self.values = set([])
        self.curValues = set([])

    def mergeList(self,head1,head2):
        
        # 设置一个临时的节点,保存最初的节点
        newHead = ListNode(0)
        pre = newHead
        
        # 开始合并
        while(head1 and head2):
            # 判断元素大小,谁小就添加谁
            if head1.val > head2.val:
                # 判断待添加的元素是否会重复
                if self.checkValue(head2.val):
                    pre.next = head2
                    head2 = head2.next
                else:
                    # 如果元素重复,head2前进一格,跳过本次循环
                    head2 = head2.next
                    continue
            else:
                if  self.checkValue(head1.val):
                     pre.next = head1
                     head1 = head1.next
                else:
                     head1 = head1.next
                     continue
             pre = pre.next
             
        # 合并剩余的节点
        if head1:
            self.mergeLeft(head1,pre)
            
        if head2:
            self.mergeLeft(head2,pre)
            
        return newHead.next
            
    
    # 检查待元素是否重复
    def checkValue(self,value):
        self.values.add(value)
        if len(self.values) > len(self.curValues):
            self.curValues.add(value)
            return True
        else:
            return False
            
    def mergeLeft(self,head,pre):
        if not head.next:
            pre.next = head
            return
        
        while head.next:
            if head.val == head.next.val:
                head = head.next
                
                if not head.next:
                    pre.next = head
                continue
            else:
                pre.next = head
                head = head.next
                
                
if __name__ == '__main__':
    head = ListNode(10)
    p1 = ListNode(20)
    p2 = ListNode(31)
    p3 = ListNode(40)
    p4 = ListNode(50)
    p5 = ListNode(60)
    p6 = ListNode(76)
    p7 = ListNode(76)
    p8 = ListNode(78)
    p9 = ListNode(78)
    p10 = ListNode(78)
    
   head.next = p1
   p1.next = p2
   p2.next = p3
   p3.next = p4
   p4.next = p5
   p5.next = p6
   p6.next = p7
   p7.next = p8
   p8.next = p9
   p9.next = p10
   
   
   head2 = ListNode(11)
   p11 = ListNode(21)
   p12 = ListNode(31)
   p13 = ListNode(31)
   p14 = ListNode(41)
   p15 = ListNode(71)
   p16 = ListNode(76)
   
   head2.next = p11 
   p11.next = p12
   p12.next = p13
   p13.next = p14
   p14.next = p15
   p15.next = p16
   
  m = Merge()
  h = m.mergeList(head,head2)
  
  while h:
      print(h.val)
      h = h.next

二进制

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

def getOneCount(num):
    if num > 0:
        b_num = bin(num)
        count = b_num.count('1')
        return count
    elif num < 0:
        b_num = bin(~num)
        count = 8 - b_num.count('1')
        return count
    else:
        return 8


if __name__ == '__main__':
    print(getOneCount(5))
    print(getOneCount(-5))
    print(getOneCount(0))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值