| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 16056 人关注过本帖, 2 人收藏
标题:发一道题,求出这个字符串
只看楼主 加入收藏
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
#include "stdio.h"

void swap(char *c1, char *c2)
{
    *c1 ^= *c2;
    *c2 ^= *c1;
    *c1 ^= *c2;
}

void fun(char array[][3], int len, char *ans)
{
    char c[128]={0};
    int i, j, k=1;
    for (i=0; i<len; i++)
        for (j=0; j<3; j++)
            if (c[array[i][j]] == 0)
                c[array[i][j]] = k++;
    ans[k] = 0;
    k = 0;
    while (1)
    {
        for (i=k; i<len; i++)
        {
            if (c[array[i][0]] > c[array[i][1]])
                swap(&c[array[i][0]], &c[array[i][1]]);
            if (c[array[i][1]] > c[array[i][2]])
                swap(&c[array[i][1]], &c[array[i][2]]);
        }
        for (i=0; i<len; i++)
            if ((c[array[i][0]] > c[array[i][1]]) || (c[array[i][1]] > c[array[i][2]]))
            {
                k = i;
                break;
            }
        if (i == len)
            break;
    }
    for (i=97; i<123; i++) //只考虑 a -- z
        if (c[i] > 0)
            ans[c[i]-1] = i;
}

main()
{
    char str[128]={0};
    char array[][3]={{'t', 's', 'f'}, {'a', 's', 'u'}, {'m', 'a', 'f'}, {'a', 'i', 'n'}, {'s', 'u', 'n'},
                     {'m', 'f', 'u'}, {'a', 't', 'h'}, {'t', 'h', 'i'}, {'h', 'i', 'f'}, {'m', 'h', 'f'},
                     {'a', 'u', 'n'}, {'m', 'a', 't'}, {'f', 'u', 'n'}, {'h', 's', 'n'}, {'a', 'i', 's'},
                     {'m', 's', 'n'}, {'m', 's', 'u'}};
    fun(array, sizeof(array)/sizeof(array[0]), str);
    puts(str);            
   
}


[此贴子已经被作者于2016-12-13 21:36编辑过]

收到的鲜花
  • azzbcc2016-12-14 09:27 送鲜花  10朵   附言:all tests runs 0.23ms
2016-12-13 20:57
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 

增加规则控制,以防挂死。


#include "stdio.h"

void swap(char *c1, char *c2)
{
    *c1 ^= *c2;
    *c2 ^= *c1;
    *c1 ^= *c2;
}

void fun(char array[][3], int len, char *ans)
{
    char c[128]={0};
    int i, j, k=1, m;
    for (i=0; i<len; i++)
        for (j=0; j<3; j++)
            if (c[array[i][j]] == 0)
                c[array[i][j]] = k++;
    ans[k] = 0;
    k = 0;
    for (m=0; m<len; m++)
    {
        for (i=k; i<len; i++)
        {
            if (c[array[i][0]] > c[array[i][1]])
                swap(&c[array[i][0]], &c[array[i][1]]);
            if (c[array[i][1]] > c[array[i][2]])
                swap(&c[array[i][1]], &c[array[i][2]]);
        }
        for (i=0; i<len; i++)
            if ((c[array[i][0]] > c[array[i][1]]) || (c[array[i][1]] > c[array[i][2]]))
            {
                k = i;
                break;
            }
        if (i == len)
            break;
    }
    if (m == len)
    {
        puts("规则自相矛盾,此题无解。");
        return;
    }
    for (i=97; i<123; i++) //只考虑 a -- z
        if (c[i] > 0)
            ans[c[i]-1] = i;
}

main()
{
    char str[128]={0};
    char array[][3]={{'t', 's', 'f'}, {'a', 's', 'u'}, {'m', 'a', 'f'}, {'a', 'i', 'n'}, {'s', 'u', 'n'},
                     {'m', 'f', 'u'}, {'a', 't', 'h'}, {'t', 'h', 'i'}, {'h', 'i', 'f'}, {'m', 'h', 'f'},
                     {'a', 'u', 'n'}, {'m', 'a', 't'}, {'f', 'u', 'n'}, {'h', 's', 'n'}, {'a', 'i', 's'},
                     {'m', 's', 'n'}, {'m', 's', 'u'}};
    fun(array, sizeof(array)/sizeof(array[0]), str);
    puts(str);            
   
}
2016-12-14 04:48
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
对这道题的一些体会,不知有无理解错。
题意:
1、假设给定一个字符串"afhimnstu",并给出这个字符串的字符排队规则(二维数组array)。
2、按排队规则重新排列字符串"afhimnstu",使得重新排列后的字符串"mathisfun"符合排队规则的要求。
3、输出重新排列后的字符串"mathisfun"。
解题过程:
1、从排队规则数组中获取某一组各字符。
2、按排队规则比较字符串(afhimnstu)中相应的字符是否符合排队规则。
3、如果不符合排队规则,相应的字符就互换位置。
4、重复1--3步骤,直到全部字符符合排队规则为止。
关键技巧:
在按排队规则比较字符时,尽可能优化搜寻字符的效率。
这道题讲到底也是字符搜寻的问题。

[此贴子已经被作者于2016-12-14 09:43编辑过]

2016-12-14 07:23
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
3、如果不符合排队规则,应的字符就互换位置。


可以看一下第20楼的change函数,不止交换两个字符,当然交换并没有错。

[此贴子已经被作者于2016-12-14 09:32编辑过]



[fly]存在即是合理[/fly]
2016-12-14 09:31
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
回复 5楼 xzlxzlxzl 8楼 九转星河 22楼 吹水佬
加了一组测试数据

2
c d e
a b c
abcde


[此贴子已经被作者于2016-12-14 10:31编辑过]



[fly]存在即是合理[/fly]
2016-12-14 09:52
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用azzbcc在2016-12-14 09:31:27的发言:



可以看一下第20楼的change函数,不止交换两个字符,当然交换并没有错。

只是用交换队列位置方法来处理前后关系,当然也不只是交换两个字符。
不管用什么方法比对,都是按排队规则相关的两个字符的前后关系比对,直到所有的相关字符位置符合其排队规则。
比对效率关键在于搜寻字串的字符,我的代码采用字串数组,不用扫描搜寻字符,点到即得到。
2016-12-14 10:01
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
回复 25楼 azzbcc
试了一下,是规则控制的问题。
看看最少的控制次数是多少。
2016-12-14 10:32
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 

修改规则控制,以防挂死。
每组两对,应该用 len*2。

#include "stdio.h"

void swap(char *c1, char *c2)
{
    *c1 ^= *c2;
    *c2 ^= *c1;
    *c1 ^= *c2;
}

void fun(char array[][3], int len, char *ans)
{
    char c[128]={0};
    int i, j, k=1, m;
    for (i=0; i<len; i++)
        for (j=0; j<3; j++)
            if (c[array[i][j]] == 0)
                c[array[i][j]] = k++;
    ans[k] = 0;
    k = 0;
    for (m=0; m<len*2; m++)
    {
        for (i=k; i<len; i++)
        {
            if (c[array[i][0]] > c[array[i][1]])
                swap(&c[array[i][0]], &c[array[i][1]]);
            if (c[array[i][1]] > c[array[i][2]])
                swap(&c[array[i][1]], &c[array[i][2]]);
        }
        for (i=0; i<len; i++)
            if ((c[array[i][0]] > c[array[i][1]]) || (c[array[i][1]] > c[array[i][2]]))
            {
                k = i;
                break;
            }
        if (i == len)
            break;
    }
    if (m == len*2)
    {
        puts("规则自相矛盾,此题无解。");
        return;
    }
    for (i=97; i<123; i++) //只考虑 a -- z
        if (c[i] > 0)
            ans[c[i]-1] = i;
}

main()
{
    char str[128]={0};
    char array[][3]={{'t', 's', 'f'}, {'a', 's', 'u'}, {'m', 'a', 'f'}, {'a', 'i', 'n'}, {'s', 'u', 'n'},
                     {'m', 'f', 'u'}, {'a', 't', 'h'}, {'t', 'h', 'i'}, {'h', 'i', 'f'}, {'m', 'h', 'f'},
                     {'a', 'u', 'n'}, {'m', 'a', 't'}, {'f', 'u', 'n'}, {'h', 's', 'n'}, {'a', 'i', 's'},
                     {'m', 's', 'n'}, {'m', 's', 'u'}};
    fun(array, sizeof(array)/sizeof(array[0]), str);
    puts(str);            
   
}
2016-12-14 10:37
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
回复 27楼 吹水佬
是len+1次,因为交换最多影响前面len-1组规则,所以第len次交换,必然不会影响


[fly]存在即是合理[/fly]
2016-12-14 10:41
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
回复 28楼 吹水佬
正确性毋庸置疑,我也测试了len+1,吹水佬版主觉得呢

[此贴子已经被作者于2016-12-14 10:46编辑过]



[fly]存在即是合理[/fly]
2016-12-14 10:43
快速回复:发一道题,求出这个字符串
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022370 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved