面試經常遇到的字串切割問題

2021-09-21 18:47:22 字數 3641 閱讀 3205

注:因為比較模糊,我簡單說一下,就a所在的位置換成a的個數

這裡要注意的是因為原題中含有字母,數字和下劃線,根據這些特點普通的查詢替換不如正則來的方便

因為我沒有封裝函式,真正面試可以先實現功能,然後再完善,最關鍵的是不管多菜,別慌

s = '1a_aa_bbb_aaa_aaaa_aaaaa_aaaaaa'

l = s.split('_')

lt =

for i in l:

if 'a' in i:

x = i.count('a')

else:

st = '1'

for j in lt:

st += str(j) + '_'

# 這個地方注意的是多加了乙個下劃線,輸出結果的時候得去掉

print(st[:-1])

結果就是這道題的延伸

這裡很巧妙的就是用到了字典,也就解決了a和非a的順序問題,其實思想很簡單

import re

test_str = '1a_aa_bbb_aaa_aaaa_aaaaa_aaaaaa'

test_str_array = test_str.split('_')

index = 0

results_dict = {}

for i_str in test_str_array:

str_len = len(i_str)

results = re.findall('[a]' % str_len,i_str)

if len(results) > 0:

results_dict[results[0]] = index

index += 1

result_str = ''

for i_str in test_str_array:

if i_str in results_dict:

len_str = '%d' % len(i_str)

result_str += len_str

else:

result_str += i_str

result_str += '_'

print(result_str[0:-1])

再來,假設給的字串是如下形式,也就是說不能簡單的切開了
s = 'adaaacfaaa'

# s = 'daaacfaaae'

# s = '1aaraataagaaa'

這樣的話,用正則的findall函式就比較方便

假設a和其他字元沒有個數相同的情況,如下**就可以了

lt = re.findall(r'[b-z1-9]+',s)

lt1 = re.findall(r'[a]+',s)

print(lt,lt1)

st = ''

if len(lt1) > len(lt):

for i in range(len(lt)):

st += str(lt1[i].count('a')) + lt[i]

st += str(lt1[-1].count('a'))

if len(lt1) < len(lt):

for i in range(len(lt1)):

st += lt[i] + str(lt1[i].count('a'))

st += lt[-1]

print(st)

考慮到有相等的情況,所以修改如下
import re

s = 'adaaacfaaa'

# s = 'daaacfaaae'

# s = '1aaraataagaaa'

# adaafgaaaa ---->1d2fg4

# 1aaafaagaa ---->13f2g2

# 1aaraataagaaa ---> 12r2t2g3

lt = re.findall(r'[b-z1-9]+',s)

lt1 = re.findall(r'[a]+',s)

print(lt,lt1)

st = ''

if s[0] == 'a':

# if len(lt1) > len(lt):

for i in range(len(lt)):

st += str(lt1[i].count('a')) + lt[i]

if s[-1] == 'a':

st += str(lt1[-1].count('a'))

# if len(lt1) < len(lt):

# for i in range(len(lt1)):

# st += lt[i] + str(lt1[i].count('a'))

# st += lt[-1]

if s[0] != 'a':

# if len(lt1) > len(lt):

# for i in range(len(lt)):

# st += str(lt1[i].count('a')) + lt[i]

# st += str(lt1[-1].count('a'))

# if len(lt1) < len(lt):

for i in range(len(lt1)):

st += lt[i] + str(lt1[i].count('a'))

if s[-1] != 'a':

st += lt[-1]

print(st)

字典的做法

import re

test_str = '1aaraataagaaa'

a_array = list(set(re.findall('[a]' % len(test_str),test_str)))

a_not_array = list(set(re.findall('[^a]' % len(test_str),test_str)))

a_array.extend(a_not_array)

result_dict = {}

for item_str in a_array:

item_iter = re.finditer(item_str,test_str)

for item_find in item_iter:

result_dict[item_find.start()] = item_str

all_keys = list(result_dict.keys())

all_keys.sort()

result_str = ""

for key_str in all_keys:

content = result_dict[key_str]

if 'a' in content:

result_str += ('%d' % len(content))

else:

result_str += content

print(result_dict)

js切割字串問題

js下有乙個字串var str 1 2 3 4 5 6 1 2 3 4 1 2 3 4 5 6 7 8 請用 號將其分割為陣列,再用 將其分割為2維陣列。可以用例如ary 0 0 這樣的各式取出陣列中的每個元素。最後輸出其中最長陣列的編號 1,2,3這樣的自然數 這個陣列中元素的個數。以及大陣列中每...

js切割字串問題

js下有乙個字串var str 1 2 3 4 5 6 1 2 3 4 1 2 3 4 5 6 7 8 請用 號將其分割為陣列,再用 將其分割為2維陣列。可以用例如ary 0 0 這樣的各式取出陣列中的每個元素。最後輸出其中最長陣列的編號 1,2,3這樣的自然數 這個陣列中元素的個數。以及大陣列中每...

面試遇到的字串操作

1.實現memcpy函式 memcpy函式 c語言記憶體拷貝函式,使用引數為void 以及需要拷貝記憶體的長度,以位元組為單位。本身memcpy沒有考慮過記憶體的重疊問題,所以只需要保證需要複製的內容,複製到相應的目的位址就行了。void memcpy void des,const void src...