剑指offer - 题49~55(字符串数字转换,数组中重复的数字,乘积数组,正则匹配,字符串是否含数值,不重复字符,链表环入口结点)

把字符串转换成整数
题目描述
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
示例1

输入
+2147483647
1a33
输出
2147483647
0
# -*- coding:utf-8 -*-
class Solution:
    def StrToInt(self, s):
        # write code here
        char_arr=['0','1','2','3','4','5','6','7','8','9','+','-']
        result=0
        sign=1
        if not s:
            return 0
        for char in s:
            if char in char_arr:
                if char=="+":
                    sign=1
                    continue
                elif char=="-":
                    sign=-1
                    continue
                else:
                    result=result*10+char_arr.index(char)
            else:
                result=0
                break
        return result*sign

数组中重复的数字
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

# -*- coding:utf-8 -*-
class Solution:
    # 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
    # 函数返回True/False
    def duplicate(self, numbers, duplication):
        # write code here
        dic={}
        for i in numbers:
            if i not in dic:
                dic[i]=1
            else:
                dic[i]+=1
        # 此处必须另起一个循环,因为要找的是第一个有重复的数字
        for i in numbers:
            if dic[i]!=1:
                duplication[0]=i
                return True
        return False

构建乘积数组
给定一个数组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]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)

# -*- coding:utf-8 -*-
class Solution:
    def multiply(self, A):
        # write code here
        # 以[i]为分割线,分别计算前半部分和后半部分的成绩,然后再将两部分乘起来
        front=[1]
        back=[1]
        for i in range(len(A)-1):
            front.append(front[i]*A[i])
            back.append(back[i]*A[-1-i])
        result=[front[j]*back[-j-1] for j in range(len(A))]
        return result

正则表达式匹配
请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配

# -*- coding:utf-8 -*-
class Solution:
    # s, pattern都是字符串
    def match(self, s, pattern):
        # write code here
        if not s and not pattern:
            return True
        elif not pattern:
            return False
        elif not s:
            # *:代表前一个字符出现0次或n次
            if len(pattern)>1 and pattern[1]=='*':
                return self.match(s,pattern[2:])
            else:
                return False
        else:
            if len(pattern)>1 and pattern[1]=='*':
                if s[0]!=pattern[0] and pattern[0]!='.':
                    return self.match(s,pattern[2:])
                else:
                    return self.match(s[1:],pattern) or self.match(s,pattern[2:]) or self.match(s[1:],pattern[2:])
            else:
                if s[0]==pattern[0] or pattern[0]=='.':
                    return self.match(s[1:],pattern[1:])
                else:
                    return False

表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。

# -*- coding:utf-8 -*-
class Solution:
    # s字符串
    def isNumeric(self, s):
        # write code here
        import re
        return re.match(r"^[\+\-]?[0-9]*(\.[0-9]*)?([eE][\+\-]?[0-9]+)?$",s)

字符流中第一个不重复的字符
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
输出描述:

如果当前字符流没有存在出现一次的字符,返回#字符。
# -*- coding:utf-8 -*-
class Solution:
    # 返回对应char
    def __init__(self):
        self.s=""
    def FirstAppearingOnce(self):
        # write code here
        res=list(filter(lambda c:self.s.count(c)==1,self.s))
        return res[0] if res else "#"
    def Insert(self, char):
        # write code here
        self.s+=char

链表中环的入口结点
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def EntryNodeOfLoop(self, pHead):
        # write code here
        # l_fast = l_slow + ring = 2 x l_slow,l_slow = ring 
        slow,fast=pHead,pHead
        while fast and fast.next:
            slow=slow.next
            fast=fast.next.next
            if slow==fast:
                slow2=pHead
                while slow!=slow2:
                    slow=slow.next
                    slow2=slow2.next
                return slow
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章