LeetCode

1. 在流数据中,寻找第k大的数

k = 3
s1 = []
while 1:
    num = int(input("Input your number: "))
    if num < 0:
        print("The 3th of numbers is ", s1[-1])
    if len(s1) < 3:
        s1.append(num)
    else:
        s1.append(num)
        s1.sort(reverse=True)
        s1 = s1[:3]
# 复杂度 klog(k)
# 方法二 小顶堆 复杂度 log(k)

2.  判断是否是回文字符串

2.1利用双指针判断,一个从左往右,另外一个从右往左,判断所在的字符是否相等

2.2利用栈来存储数据,然后依次出栈,观察出栈的顺序是不是与入栈的顺序一样

def isPalindrome(str1):
    if len(str1) == 0:
        return True
    left = 0
    right = len(str1) - 1
    while left < right:
        if not(str1[left].isalnum()):  # 除了字符(包括汉字)和数字以外,其他的不比较,跳过
            left += 1
        elif not(str1[right].isalnum()):
            right -= 1
        else:
            if str1[left] != str1[right]:
                return False
            left += 1
            right -= 1
    return True


str1 = "level"
bool1 = isPalindrome(str1)
print(bool1)  # true

bool symmetry(ElemType str[]){
int i;ElemType e; SqStack *st;
InitStack(st);  //初始化栈
for(i=0;str[i]!='';i++){  //将数组中的元素依次入栈
Push(st,str[i]);
}

for(i=0;str[i]!='';i++){  // 将栈中的元素依次出栈,与入栈的顺序进行比较
Pop(st,e);
if(str[i]!=e){
DestroyStack(st);
return False;
}
}
DestroyStack(st);
return False;
}

3.判断回文数

方法一:将整数转为字符串,利用上文的方法解决问题

方法二:数学方法

分别计算出整数的最高位和最低位的值进行比较,循环,依次进行判断

def isPalindrome(num):
    if num < 0:
        return False
    div = 1
    while (num//div) >= 10:   # 计算出整数的位数
        div *= 10
    while num > 0:
        left = num//div   
        right = num % 10
        if left != right:
            return False
        num = (num % div)//10  # 去掉最右边和最左边的值
        div = div/100
    return True


print(isPalindrome(1221))

 方法三 把整数对折后看两边的数是否相同

def isPalindrome(x):
    if x<0 or (x and x%10==0):  # 当整数的最后一位是0时,返回false
        return False
    reverse_number = 0
    while x > reverse_number:
        reverse_number = reverse_number*10 + x%10
        x = x // 10
    return x==reverse_number or x==reverse_number//10   # 当整数位数不是偶数时,比较时去掉一位


print(isPalindrome(12521))
原文地址:https://www.cnblogs.com/nxrs/p/10702881.html