| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 16191 人关注过本帖, 2 人收藏
标题:发一道题,求出这个字符串
取消只看楼主 加入收藏
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
结帖率:100%
收藏(2)
已结贴  问题点数:100 回复次数:14 
发一道题,求出这个字符串
完善如下函数:

// 根据二维数组求出字符串,通过ans指针返回数据
void fun(char array[][3], int len, char *ans) {}

example:
程序代码:
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);   // mathisfun

二维数组有len组,每组表示3个字母的先后顺序

如上例 array[0] = {'t', 's', 'f'} 表示所求字符串中 t的位置在s前,s位置在f前


给个算法就行,当然有代码最好,要求时间限制,我试过全排列runtime error

补充一下:字符串不含重复字母,数据保证有唯一解


项目:
test.zip (4.67 KB)


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

搜索更多相关主题的帖子: example 字符串 color 
2016-12-09 16:30
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
回复 7楼 xzlxzlxzl
程序代码:
7
t u p
w h i
t s u
a t s
h a p
t i s
w h s
whatisup


这组数据没过


[fly]存在即是合理[/fly]
2016-12-12 10:42
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
回复 8楼 xzlxzlxzl
201612121331
数据出错,此层作废


原内容如下
====
3
d e f
a b c
b d e
abcdef




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



[fly]存在即是合理[/fly]
2016-12-12 11:56
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
回复 9楼 linlulu001
201612121335

这组数据
程序代码:
4
d e f
a b c
b d e
c d f
abcdef


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



[fly]存在即是合理[/fly]
2016-12-12 11:57
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
回复 11楼 九转星河
201612121403

测试方法有问题,已修复


还是说明一下,你的strchr操作的结果并不是确定的,

测试中出现的问题是因为访问了超出范围的数据,ps 指向了二维数组之外的地址

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



[fly]存在即是合理[/fly]
2016-12-12 13:25
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
经两位版主提醒,数据已做修改,已经重新回复


[fly]存在即是合理[/fly]
2016-12-12 13:39
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
恩,最终版本放在这里了

程序代码:
#include "fun.h"

// 最终字符串长度
int getLength(char array[][3], int len)
{
    int num = 0;
    bool flags[CHAR_MAX] = {false};

    for (int i = 0; i < len; ++i)
    {
        flags[array[i][0]] = true;
        flags[array[i][1]] = true;
        flags[array[i][2]] = true;
    }
    for (int i = 0; i < CHAR_MAX; ++i)
    {
        if (flags[i]) num++;
    }
    return num;
}

// 判断array后两列是否包含字符ch
bool isIn(char ch, char array[][3], int len)
{
    for (int i = 0; i < len; ++i)
    {
        if (ch == array[i][1]) return true;
        if (ch == array[i][2]) return true;
    }
}

// 获取第一个字符
char findFirst(char array[][3], int len)
{
    for (int i = 0; i < len; ++i)
    {
        if (!isIn(array[i][0], array, len)) return array[i][0];
    }
    return -1;
}

// 从数组中删除ch,并前移其他项
void change(char ch, char array[][3], int len)
{
    for (int i = 0; i < len; ++i)
    {
        if (ch == array[i][0])
        {
            array[i][0] = array[i][1], array[i][1] = array[i][2], array[i][2] = -1;
        }
        if (ch == array[i][1])
        {
            array[i][1] = array[i][2], array[i][2] = -1;
        }
        if (ch == array[i][2])
        {
            array[i][2] = -1;
        }
    }
}

void fun(char array[][3], int len, char *str)
{
    int ans_len = getLength(array, len);

    for (int i = 0; i < ans_len; ++i)
    {
        str[i] = findFirst(array, len);

        change(str[i], array, len);
    }
    str[ans_len] = '\0';
}


[fly]存在即是合理[/fly]
2016-12-12 17:04
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
这里数据不够全,新的数据放在首页了


把项目放在这里,有兴趣的同学可以自己测试
test.zip (4.8 KB)


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

收到的鲜花
  • 九转星河2016-12-12 19:48 送鲜花  10朵   附言:好文章


[fly]存在即是合理[/fly]
2016-12-12 17:21
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
得票最多的算法,简直想撞墙

程序代码:
#include "fun.h"

void getString(char array[][3], int len, char *str)
{
    int pos = 0;
    bool flags[CHAR_MAX] = {false};

    for (int i = 0; i < len; ++i)
    {
        flags[array[i][0]] = true;
        flags[array[i][1]] = true;
        flags[array[i][2]] = true;
    }
    for (int i = 0; i < CHAR_MAX; ++i)
    {
        if (flags[i]) str[pos++] = (char) i;
    }
    str[pos] = '\0';
}

void change(char *p1, char *p2)
{
    char tmp = *p1;
    while (p1 < p2)
    {
        *p1 = *(p1 + 1);
        p1++;
    }
    *p2 = tmp;
}

bool fix(char array[][3], int len, char *str)
{
    for (int i = 0; i < len; ++i)
    {
        char *p1 = strchr(str, array[i][0]);
        char *p2 = strchr(str, array[i][1]);
        char *p3 = strchr(str, array[i][2]);

        if (p2 > p3)
        {
            change(p3, p2);
            return true;
        }

        if (p1 > p2)
        {
            change(p2, p1);
            return true;
        }
    }

    return false;
}

void fun(char array[][3], int len, char *str)
{
    getString(array, len, str);

    while (fix(array, len, str));
}


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



[fly]存在即是合理[/fly]
2016-12-12 18:04
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
快速回复:发一道题,求出这个字符串
数据加载中...
 
   



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

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