基础题
1、 &和 | 既是逻辑运算符也是位运算符
一个就表示位运算
6&3=110&011=010=2
6|3=110|011=111=7
两个就是判断真假的问题
2、常见的网络传输协议
UDP、TCP、FTP、HTTP、SMTP等等
3、在c中29的17次幂
SQL部分
三、SQL笔试题
用一条SQL语句 查询出每门课都大于80分的学生姓名。表scores如下:
name kecheng fenshu
张三 语文 81
张三 数学 75
李四 语文 76
答案:SELECT DISTINCT name FROM grade WHERE name NOT IN(SELECT DISTINCT name FROM grade WHERE score <=80);
18、数据表student有id,name,score,city字段,其中name中的名字可有重复,需要消除重复行,请写sql语句
select distinct name from student
编程题
笔试牛客里面的编程不会提示什么错误,如果出现通过80%的情况就需要自己试了
编程一般一题是20分,3题或者2题自己尽量做一题出来即可
人生就像是一场长跑,有很多机会,但也得看我们是否能够及时抓牢,就像下面这样的代码:
while(isRunning)
{
if(...){...}
else if(...){...}
...
else{..}
}
存在着太多的if...else if...else...,很多都是一闪而过,就看我们是否将isRunning时刻设置为true,一直不断在跑,一直不断在检查条件是否满足。就算条件达到了,有些人会选择return或者将isRunning设置为false,主动退出循环,有些人选择继续跑下去,不断追寻更高的目标。
1、将一个正整数分解质因数
质因数:质数+约数
10=2*5,数字5的处理
print本来是多行打印,需要一行打印,只需要在print中加入end=" "
{}的用法
def reduceNum(n):
if not isinstance(n, int) or n <= 0 :
exit(0)
elif n in [1] :
print("{}={}".format(n,n),end=" ")#1=1的写法
exit(0)
print("{}=".format(n), end=" ")
while n not in [1] : # 循环保证递归
for index in range(2, n + 1) :
if n % index == 0:
n =n// index # 必须要要用//,去除数的整数
if n == 1: # This is the point
print (index,end=" ") #打印最后一个数
#lis.append(index)
else : # index 一定是素数
print( '{} *'.format(index),end=" ")
#lis.append(index)
break
reduceNum(1)
2、排序去重
set函数的使用,set的结果必须用list转化
先set,如果没list而直接sort会报错AttributeError: 'set' object has no attribute 'sort'(并且一定先set减少数据量,在sort,避免数据量过大)
join连接列表中元素时,一定要将列表中元素转化为str类型
3、n个数连成一排,求出其中最小的数
考虑情况:如:9和两位数32,此时9应该被排在前面
暴力解法:将所有数组合输出
①使用排列函数permutations(),必须导入迭代模块itertools。a = itertools.permutations(numbers)入口参数必须是列表,返回对象是元组
②三个数1,23,4,则组合元组有6种情况
import itertools
def PrintMinNumber1(numbers):
result = []
a = itertools.permutations(numbers)
for each in a:
tmp =""
for i in each:
tmp = tmp + str(i)
result.append(tmp)
return min(result)
n=int(input())
lis=[]
for i in range(n):
lis.append(int(input()))
print(PrintMinNumber1(lis))
①只需要考虑月份对应的总天数+此月对应天数
②正常2月28天,闰年二月29天,闰年判断方法:能被100或4整除and能被400整除
year=int(input())
month=int(input())
day=int(input())
sum=day
days = [31,28,31,30,31,30,31,31,30,31,30,31]
i=0
if ( year%4 == 0 and year%100 != 0) or (year%400 == 0):#考虑闰年的情况,直接改变第二个月的值
days[1] = 29
while i< month-1:#月份统计,i值不断增加
sum=sum+days[i]
i+=1
print(sum)
5、深度优先搜索 DFS
6、走矩形的走法和路径足大值
4×5的数组从左上角到右下角的走法有多少种?程序怎么写?
排列组合角度考虑,只需要考虑在总的步数中往下走或者往右走多少步:
从左上角到右下角,总共需要走n+m-2步,左上角和右下角的元素不考虑在内,我们每次都可以选择向下走,向下走总共需要m-1步,所以在n+m-2步中选择m-1步,这是典型的排列组合问题
程序:直接将排列组合的表达式通过程序写出来
int uniquePaths(int m, int n)
{
int N = n + m - 2;
int K = n - 1;
double res = 1.0;
for (int i = 1; i <= n - 1; ++i)
{
res = res * (N - K + i) / i;
}
return (int)res;
}
如果有途中有障碍物:https://blog.csdn.net/sinat_35261315/article/details/78594116
问题拓展:4×4的四位数组,从左上角到右下角,实现路径上数字和最大/小
7、统计一个数二进制中1的个数,两数异或
8、找字符串中不重复的最大子串
def find_longest_no_repeat_substr(one_str):
res_list = []
length = len(one_str)
for i in range(length):
tmp = one_str[i]
for j in range(i + 1, length):
if one_str[j] not in tmp:
tmp += one_str[j]
else:
break
res_list.append(tmp)#将不重复的字符串全部存入列表中
#res_list.sort(lambda x, y: cmp(len(x), len(y)))
res_list.sort(key=lambda x: len(x))
return res_list[-1]
if __name__ == '__main__':
one_str_list = ['120135435', 'abdfkjkgdok', '123456780423349']
for one_str in one_str_list:
res = find_longest_no_repeat_substr(one_str)
print( '{0}最长非重复子串为:{1}'.format(one_str, res))
9、实现链表的反转
class Solution(object):
def reverseList(self, head):
if head == None:#head表示原链表的头节点。如果没有头节点,反转仍为空,返回空
return []
last_temp = None #添加一个指针,初始化为空,用于反转后的最后一个节点。同时会在while中不断后移
temp = head #添加另一个指针
while (temp != None):
temp_next = temp.next#取出头节点的下一个节点
temp.next = last_temp
last_temp = temp
temp = temp_next#指向头节点的指针现在指向第二个节点
return last_temp
10、判断链表是否存在环状
class Node():
def __init__(self, val=None):
self.val = val
self.next = next
def findbeginofloop(head): # 判断是否为环结构并且查找环结构的入口节点
slowPtr = head # 将头节点赋予slowPtr
fastPtr = head # 将头节点赋予fastPtr
loopExist = False # 默认环不存在,为False
if head == None: # 如果头节点就是空的,那肯定就不存在环结构
return False
while fastPtr.next != None and fastPtr.next.next != None: # fastPtr的下一个节点和下下个节点都不为空
slowPtr = slowPtr.next # slowPtr每次移动一个节点
fastPtr = fastPtr.next.next # fastPtr每次移动两个节点
'''
计算环长时
slowstepnum += 1
faststepnum += 2
'''
if slowPtr == fastPtr: # 当fastPtr和slowPtr的节点相同时,也就是两个指针相遇了
loopExist = True
print("存在环结构")
break
# 环长 = fast走的步长 - slow走的步长
if loopExist == True:
slowPtr = head
while slowPtr != fastPtr:
fastPtr = fastPtr.next
slowPtr = slowPtr.next
return slowPtr#返回环的入口点
print("不是环结构")
return False
if __name__ == "__main__":
node1 = Node(1)
node2 = Node(2)
node3 = Node(3)
node4 = Node(4)
node5 = Node(5)
node1.next = node2
node2.next = node3
node3.next = node4
node4.next = node5
node5.next = node2
print(findbeginofloop(node1).val)
输出结果: