华为2016研发工程师编程题

练习:http://www.nowcoder.com/test/710802/summary
[编程题]删数
有一个数组a[N]顺序存放0-N,要求没隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。

输入描述:
每组数据为一行一个整数n(小于等于1000),为数组成员数,如100,则对a[999]进行计算。


输出描述:
一行输出最后一个被删掉的数的原始下标位置。

输入例子:
8

输出例子:
6
思路:由于只隔着2个数,所以可以用循环链表,或者用队列模拟,应该还可以找规律吧,不过我没时间想,所以,我用的是队列模拟的,队首取数,用一个计数器计数,隔2个删一个,其他的重新放到队尾。

#include
#include
using namespace std;
 
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        queueQ;
 
        for(int i=0;i

[编程题]字符集合
输入一个字符串,求出该字符串包含的字符集合

输入描述:
每组数据输入一个字符串,字符串最大长度为100,且只包含字母,不可能为空串,区分大小写。


输出描述:
每组数据一行,按字符串原有的字符顺序,输出字符集合,即重复出现并靠后的字母不输出。

输入例子:
abcqweracb

输出例子:
abcqwer
思路:我用vis[]记录已经出现的数,把没出现过的数存入数组(或者vector)内,最后在输出即可。O(n)


#include
#include
using namespace std;
 
int main()
{
    char ch[105];
    char num[55];
    while(scanf("%s",ch)!=EOF)
    {
        bool vis[260]={false};
        int cnt=0;
        for(int i=0;ch[i];i++)
        {
            if(!vis[ch[i]])
            {
                vis[ch[i]]=true;
                num[cnt++]=ch[i];
            }
        }
        num[cnt]='\0';
        for(int i=0;i

[编程题]数独
数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。

输入描述:
输入9行,每行为空格隔开的9个数字,为0的地方就是需要填充的。


输出描述:
输出九行,每行九个空格隔开的数字,为解出的答案。

先说下数独的游戏规则:

在一个9x9的方格中,你需要把数字1-9填写到空格当中,并且使方格的每一行和每一列中都包含1-9这九个数字。同时还要保证,空格中用粗线划分成9个3x3的方格也同时包含1-9这九个数字。比如有这样一个题,大家可以仔细观察一下,在这里面每行、每列,以及每个3x3的方格都包含1-9这九个数字。


简单的DFS,将所有未填的位置依次保存起来,之后,对每一个未填的位置依次枚举,往下搜即可


不过现在牛客的数据没过,管理员还在调试。。。大家可以讨论下。


链接:http://www.nowcoder.com/profile/825348/codeBookDetail?submissionId=1097998


#include
struct point
{
    int x, y;
} p[81];
int num, flag, map[10][10];
int judge(int n, int k)
{
    int i, j, x, y;
    for(i = 0; i < 9; i++)
    {
        if(i != p[n].y && map[p[n].x][i] == k)
            return 0;
        if(i != p[n].x && map[i][p[n].y] == k)
            return 0;
    }
    x = p[n].x / 3 * 3;
    y = p[n].y / 3 * 3;
    for(i = 0; i < 3; i++)
        for(j = 0; j < 3; j++)
            if(map[x+i][y+j] == k && (i != p[n].x || j != p[n].y))
                return 0;
    return 1;
}
void dfs(int n)
{
    int i;
    if(n == num)
    {
        flag = 1;
        return;
    }
    for(i = 1; i < 10; i++)
    {
        if(judge(n, i))
        {
            map[p[n].x][p[n].y] = i;
            dfs(n + 1);
            if(flag)
                return;
            map[p[n].x][p[n].y] = 0;
        }
    }
    return;
}
int main()
{
    int i, j, t = 0;
    char s[2];
    while(scanf("%s", s) != -1)
    {
        num = flag = 0;
        if(s[0] == '0')
            p[num].x = 0, p[num++].y = 0, map[0][0] = 0;
        else
            map[0][0] = s[0] - '0';
        for(i = 0; i < 9; i++)
            for(j = 0; j < 9; j++)
                if(i || j)
                {
                    scanf("%s", s);
                    if(s[0] == '0')
                        p[num].x = i, p[num++].y = j, map[i][j] = 0;
                    else
                        map[i][j] = s[0] - '0';
                }
        dfs(0);
        if(t++)
            printf("\n");
        for(i = 0; i < 9; i++)
        {
            for(j = 0; j < 8; j++)
                printf("%d ", map[i][j]);
            printf("%d\n", map[i][8]);
        }
    }
    return 0;
}



你可能感兴趣的:(名企面试编程,IT面试题分享)