达观数据笔试题目
题目1 :
给定一个字符串,找到最长子字符串的长度,要求子字符串中所有字符不重复。
Example:
Input: "abcabcbb"
Output: 3
Explanation: 满足条件的最长子字符串为 "abc", 长度为3.
思路:
解法一:这一题如果使用暴力解法时间复杂度较高。暴力解法就是两层循环遍历判断是否遇到重复
解法二:
-
用滑动窗口的方式时间复杂度较低;
-
定义一个字典d用来存字符和字符的位置
-
定义一个变量start来存我们滑动窗口的起点
-
定义一个变量tmp用来存此窗口的长度
-
定义一个变量res用来存最大的长度
代码如下:
def lengthOfLongestSubstring(s):
res = 0
if s is None or len(s) == 0:
return res
d = {}
tmp = 0
start = 0
for i in range(len(s)):
if s[i] in d and d[s[i]] >= start:
start = d[s[i]] + 1
tmp = i - start + 1
d[s[i]] = i
res = max(res, tmp)
print(d)
return res
res = lengthOfLongestSubstring('abcabcbb')
print(res)
题目2:
有两个有序链表A和B,合并A和B成为一个新的有序列表C,并去除其中的重复元素。尽量不要开辟新的存储空间,时间复杂度O(n)。
思路:
定义一个新的链表node,然后同步的对a列表和b列表朝下遍历
a和b谁的下一个节点的值较小就把谁接在node链表后面,并把next节点值较小的链表朝后移一位
如果a和b的next节点的值相等,a和b都朝后移一位。把a接在node后面。
代码如下:
#定义链表类
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def mergeTwoLists(l1,l2):
res = ListNode(None)
node = res
while l1 and l2:
if l1.val<l2.val:
node.next,l1 = l1,l1.next
elif l1.val>l2.val:
node.next,l2 = l2,l2.next
else:
node.next,l1,l2 = l1,l1.next,l2.next
node = node.next
if l1:
node.next = l1
else:
node.next = l2
return res.next