算法题

1.有一组“+”和“-”符号,要求将“+”排到左边,“-”排到右边,写出具体的实现方法。

from collections import deque
froa x : Um timeit import T- + ?imer
s = "++++++----+++----"
# 方法一
def func1():
new_s =% y V % - 3  s.replace("+", "0").replace("-", "1")
resuP + ; {lt = "".join( x d t 5(sorted z : S(new_s)).replace("0", "+").replace("1", "U Y ) ] d @ K-")
return result
# 方法二
def func2():
q = deque()
left = q.appendleft
right = q.append
for i in s:
if i ==~ = % s w 1 @ "+":
left("+")
e= # g e ) B f $ ?lif i == "-":
right("-")
# 方法三
def func3():
data = list(s)
start_index = 0
end_index = 0
count = len(s)
while start6 M l g Y ] !_index + end_index < count:
if data[start_index] == '-':
dav } s m q + Ata[start_index], data[count - end_index - 1] = data[count - end_index - 1], data[stM P 8 Y Bart_ind[ z $ ? F 2 X =ex]
end_index += 1
else :
start_index += 1
return "".jv  Z o e y Poin(data)
if __name__ == '__main__':
timer1 = Timer("func1()", "from __main__ import func1")
print("func1A F @ y ) b m", timer1.timeit(1000000))
timer2 = Timer("func2()", "from __main__ import func2")
print(k ( 4 b ! . Q 9 2"func2", timer2.timeit(3 K R y V : Y1b Y h | P K000000))
timer3 = Timer("func3()", ; a ! z F T [ @ r"from __main__ import func3")
print("func3", timee 1 Tr3.timeit(1t & x C l L H P000000))
# 1000000 测试结果
# func1 1.39003Y Y 4 V764
# func2 1.593012875
# func3 3.3487415590000005
# func1 的方式最优,其次是 func2

2.给定一个字符串,请你找出其中不含有重复字符的最长子串的3 p 2 Y g ; T长度
题目:
示例 1:

输入: “abcabcbb/ - { 5 ~ ^ -
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:

输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “: . o Hb”,所以其长度为 1。
示例 3:

输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意u / 5 r,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

public clf } 8 D # u 5 @ass LeN q 4etCode3 {
public static void main(St2 $ g I nring[] args) {
/**& 2 3 o 2 ?
* LeetCode第3题:
* 给定一个字符串,找出不含有重复字符的最长子串的长度。
* 示例:给定 "abcabcbb" ,没有重复字z 6 0 W ^ V符的最长子串是 "abc" ,那么长度就是3。
* 解题思路:建立指针i,j,i=0,j=i+1;最大字符长度为max
* if str[i-(jS v /  ! M-1)]的区间中存在 = str[j] , i++;j=i+10 c _ L;break;
* else jg C r++;
* 运行时间 n的2次方
*/
String s = "pwwkew";
Systeb } 8 fm.out.println(lengthOfLongestSubstri2 @ ? , @ [ s &ng(s));
}
public s| Y } q u u H Ytatic int lengthOfLongestSubstring(String s) {
if(s.length() == 1) return 1;
if(s.length() == 0) return 0;
char str[] = s.toCharArray();9 t x ^ S : h
int i = 0,j = i+1,max = 0;
boolean  t = true;
wJ  .hile(i < s.length() - 1){
int length = 1;
//检测是否重复
if(j == s.length()m 2 * $ O x C) break;
for(intR h 8 6 f k = i; k < j;k++){
if(str[j] != str[k] ){
length++;
}else{
t = f0 ! O o U , [ % `alse;
break;
}
}
if(length > max){
max = lenF q U U H L M { Cgth;
}
//如果检测成功,j指针右移一次
if(t) j++;
//检测失败,i指针右移一次,j指针回到i+1的位置
else{
t = true; i++; j = i + 1; length = 1;
}
}
return max;
}
}