##第十四题 #编写一个函数ff, 给定一个字符串,请你将字符串重新编码,将连续的字符替换成“连续出现的个数+字符”。比如字符串ff(“AAAABCCDAA”)会被编码成A4B1C2D1A2,
时间: 2024-02-01 12:14:19 浏览: 128
可以使用双指针来遍历字符串,当指针指向的字符不同时,将前面连续相同的字符个数和字符一起拼接到结果字符串中。具体实现如下:
```python
def ff(s):
if not s:
return ""
n = len(s)
res = ""
count = 1
for i in range(1, n):
if s[i] == s[i-1]:
count += 1
else:
res += s[i-1] + str(count)
count = 1
# 处理最后一段连续相同字符
res += s[-1] + str(count)
return res
```
测试:
```python
print(ff("AAAABCCDAA")) # A4B1C2D1A2
```
相关问题
Excel使用VBA定义通过字符串#0000FF数据修改单元格背景色的函数
在Excel VBA中,你可以定义一个用户自定义函数(User Defined Function, UDF)来改变指定单元格的背景颜色,给定一个十六进制颜色值。下面是一个简单的例子,该函数名为`SetBackgroundColor`,它接受一个字符串作为输入:
```vba
Function SetBackgroundColor(cell As Range, colorCode As String)
' 验证颜色值是否有效
If Not IsHexColor(colorCode) Then
MsgBox "无效的颜色代码!"
Exit Function
End If
' 将十六进制颜色转换为RGB格式
Dim rgbColor As Long
rgbColor = RGB("&H" & Replace(colorCode, "#", ""))
' 设置单元格背景色
cell.Interior.Color = rgbColor
End Function
' 辅助函数,检查颜色是否为有效的十六进制格式
Private Function IsHexColor(hexStr As String) As Boolean
If Len(hexStr) <> 7 Or Left(hexStr, 1) <> "#" Then
IsHexColor = False
Else
IsHexColor = True
End If
End Function
```
使用这个函数时,可以像这样调用:
```vba
SetBackgroundColor Range("A1"), "#0000FF"
```
这将把A1单元格的背景色设置为蓝色。
c语言如何手写通用strtok函数实现字符串分割功能,将启动参数bootargs中配置的ekbox=0x20000$0x5FFD00000和kbox_mem=0xb00000@0x27ff000000分别解析得到内存大小和内存地址
在C语言中,`strtok()` 函数通常是在库函数中提供的,用于字符串的分隔。如果要手动实现这个功能,你可以创建一个自定义版本的`strtok_r()`(线程安全版本),并根据需要解析字符串。这里是一个简单的示例,假设我们正在处理的字符串格式是"key=value",其中值由 `$` 分割表示内存大小,`@` 分割表示内存地址:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* strtok_custom(char* str, const char* delims) {
static char* last_token = NULL;
char* token = strtok_r(str, delims, &last_token);
if (token == NULL) {
return NULL;
}
// 解析内存大小
if (strstr(token, "$") != NULL) {
size_t size_start = strlen(token) - 1; // 找到最后一个$
char* size_end = strchr(token + size_start, '$');
size_t mem_size = strtoul(token + size_start + 1, NULL, 16); // 将十六进制转换为整数
printf("Memory Size: %zu bytes\n", mem_size);
// 解析内存地址
char* addr_start = token;
while (addr_start[-1] != '@') {
addr_start--;
}
size_t addr_size = addr_start - token; // 计算地址部分长度
char* addr_end = addr_start + addr_size;
printf("Memory Address: 0x%zx\n", strtoul(addr_end, NULL, 16));
}
return token;
}
int main(int argc, char** argv) {
if (argc > 1) {
char* bootargs = argv[1];
char* current = bootargs;
while (*current != '\0') {
current = strtok_custom(current, "= $@");
if (current != NULL) { // 如果还有剩余部分
current++; // 跳过空格
}
}
} else {
printf("Please provide a string to parse.\n");
}
return 0;
}
```
这个示例会在给定的`argv[1]`参数上应用`strtok_custom`函数,并打印出每个键对应的内存大小和地址。请注意这只是一个简化版的解析器,实际项目中可能需要更复杂的正则表达式或其他方法来处理复杂格式。
阅读全文