Back

刷题1

sql和算法

182. 查找重复的电子邮箱

select `Email` from

(

 select `Email`, count(`Email`) as a

 from `Person`

 group by `Email`

) as temp

where a > 1;

一些不熟悉的语句

like 模糊查询

select * from employees where last_name like '%a%';

group by(常常和聚合函数一起使用) 聚合函数:count() , sum() , avg() , max() , min() 根据by对数据按照哪个字段进行分组,或者是哪几个字段进行分组。

select  字段   from  表名  where   条件   group  by    字段;
# 单字段
select  grade  from  student   group   by   grade;

# 多字段
select  name , sum(salary)    from   student    group  by   name , grade;
name和grade看成一个整体name和grade相同的才可以分成一组,一个不一样就不能分成一组。

having 对group by分组和聚合之后的数据进行过滤 (与where正好相反)

select  字段   from  表名  group  by   字段   having   过滤条件;

-- 查找人数大于 5 的部门
select dept_id, count(*)
from employee
group by dept_id
having count(*) > 5;

dept_id|count(*)|
-------|--------|
      4|       9|
      5|       8|

union 联合查询

select * from employees where eamil like '%a%' or department_id>90;
相当于
select * from employees where eamil like '%a%' 
union 
select * from employees where department_id>90;

CONCAT() 函数

CONCAT(str1,str2,…)

将多个字符串连接成一个字符串。

GROUP_CONCAT()函数

返回一个字符串结果,该结果由分组中的值连接组合而成。

175. 组合两个表

select FirstName, LastName, City, State
from Person  left join Address on Person.PersonId = Address.PersonId;

left join

也叫left outer join,外连接

  • 1、 on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
  • 2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

P1255 数楼梯

a = int(input())
def gogogo(index):
    if index > 2:
        print(index)
        return gogogo(index-1) + gogogo(index-2)
    elif index == 2:
        return 2
    elif index == 1 or index == 0:
        return 1
print(gogogo(a))

思路是对的,但是层数一多就g了

于是想用循环取代递归

n = int(input())
l = [0 for i in range(0,n+2)]
l[0], l[1] = 1,1
if n == 0:
    print(0)
else:
    for i in range(2,n+1):
        l[i] = l[i-1] + l[i-2]
    print(l[n])

这样是可以通过的

但是上网又搜了一个更恐怖的

a, b = 0, 1
for i in range(int(input())): 
    a, b = b, a + b
print(b if a else 0)

P1143 进制转换

def trans_map(cint):
    if cint < 0:
        print("不合法")
        return
    elif cint < 10:
        return cint

    elif cint >= 10:
        return chr(cint - 10 + 65)

def anyToTen(m, origin):
    # 任意进制的数转换为10机制
    # 先将m转换为10进制
    # 公式 num = an * m**(n-1) + an-1 * m**(n-2).....+ a0 * m**0
    # 直接利用int的自带功能
    return int(str(origin), base=m)

def tenToAny(n, origin):
    # 10进制转换为任意进制的数
    list = []
    while True:
        # 取商
        s = origin // n
        # 取余数
        tmp = origin % n
        list.append(trans_map(tmp))
        if s == 0:
            break
        origin = s
    list.reverse()
    list = [str(each) for each in list]
    print(''.join(list))

# 将一个m进制的数转换为一个n进制的数
def transfer(m, n, origin):
    num = anyToTen(m, origin)
    target = tenToAny(n, num)

if __name__ == '__main__':
    a = int(input())
    b = input()
    c = int(input())
    transfer(a,c,b)
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy
© Licensed Under CC BY-NC-SA 4.0