电信L2-重排序字符串使得字符串相邻字符不相同

题目3:重排序字符串
第一行输入数字N
第二行输入长度为N的一个字符串
输出:重排序(方法可以有多种,自己想,长度不能变),使得这个长度为N的字符串相邻字符不相同,如果可以实现,则第一行输出"yes",第二行输出重排序后字符。
      如果不能实现,则第一行输出"no"。

#终版
N=int(input())
s=input()
s_list=list(s)
s_list.sort()#按顺序排序

s_list_1=[]#去重
s_list_1_num=[]#每个字母出现的次数
for i in s_list:
    if i not in s_list_1:
        s_list_1.append(i)

for i in s_list_1:
    n=s_list.count(i)
    s_list_1_num.append(n)
n_max=max(s_list_1_num)#重复字符出现的最大次数
if N%2==0:#偶数
    n_level=int(N/2)#8个数,小于等于4都可以 aaaaabbb,abababaa,不行

if N%2!=0:#奇数数
    n_level=int((N+1)/2)#9个,小于5个可以 aaaaabbbb,ababababa

s1_list=s_list[:n_level]#分段1
s2_list=s_list[n_level:]#分段2
#分段1和分段2间隔

s_list_px=[]
s_list_px2=[]
if n_max<=n_level:
    print("yes")
    if N%2==0:#偶数
        for i in range(0,n_level):#偶数index
            t=[s1_list[i],s2_list[i]]
            s_list_px2.append(t)
        for i in s_list_px2:
            for j in range(2):
                s_list_px.append(i[j])
        print("".join(s_list_px))
    if N%2!=0:#奇数
        s2_list.append(0)#添加最后1位0
        for i in range(0,n_level):#偶数index
            t=[s1_list[i],s2_list[i]]
            s_list_px2.append(t)
        for i in s_list_px2:
            for j in range(2):
                s_list_px.append(i[j])
        print("".join(s_list_px[:-1]))#去除最后一位    字符串可以这样写。
else:
    print("no")   
10
aaaaaabbbb
no

11
aaeeffejjjj
yes
afajejejejf
链表字符串排序可以使用归并排序算法。 具体实现步骤如下: 1. 定义链表节点结构体,包含字符串和指向下一个节点的指针。 2. 定义归并排序函数,输入为链表的头指针,输出为排序后的链表头指针。 3. 在归并排序函数中,先对链表进行分割,直到链表只剩一个节点或为空。 4. 对分割后的链表进行归并,具体实现可以使用双指针法,依次比较两个链表节点的字符串大小,将较小的节点插入到新链表的尾部。 5. 最后返回新链表的头指针即可。 代码实现如下: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct Node { char str[100]; struct Node* next; } Node; Node* merge(Node* l1, Node* l2) { Node* head = (Node*)malloc(sizeof(Node)); Node* cur = head; while (l1 && l2) { if (strcmp(l1->str, l2->str) < 0) { cur->next = l1; l1 = l1->next; } else { cur->next = l2; l2 = l2->next; } cur = cur->next; } cur->next = l1 ? l1 : l2; return head->next; } Node* sortList(Node* head) { if (!head || !head->next) { return head; } Node* slow = head; Node* fast = head->next; while (fast && fast->next) { slow = slow->next; fast = fast->next->next; } Node* mid = slow->next; slow->next = NULL; Node* l1 = sortList(head); Node* l2 = sortList(mid); return merge(l1, l2); } int main() { Node* head = (Node*)malloc(sizeof(Node)); head->next = NULL; int n; printf("Input n: "); scanf("%d", &n); printf("Input strings: "); for (int i = 0; i < n; i++) { char s[100]; scanf("%s", s); Node* node = (Node*)malloc(sizeof(Node)); strcpy(node->str, s); node->next = NULL; Node* cur = head; while (cur->next && strcmp(s, cur->next->str) > 0) { cur = cur->next; } node->next = cur->next; cur->next = node; } head = sortList(head->next); printf("Sorted strings: "); Node* cur = head; while (cur) { printf("%s ", cur->str); cur = cur->next; } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值