zoukankan      html  css  js  c++  java
  • 2016.4.3腾讯笔试编程题

    1. 蛇形矩阵

    题目大意:给一个边长n,给出1-n^2的数字蛇形数据,例如以下
    n=3

    187296345

    output:1 2 3 8 9 4 7 6 5

    #include <stdio.h>
    #include <string.h>
    int main()
    {
        int n;
        int i, j, k, row, col, trow, tcol, ttrow, ttcol;
        int cnt, tcnt;
        int a[100][100];
        while(scanf("%d", &n)!=EOF)
        {
            cnt=1;
            tcnt=2*n-1;
            row=col=0;
            for(i=n; i>0; i-=2)
            {
                trow=row;
                tcol=col;
                ttrow=row+i-1;
                ttcol=col+i-1;
                for(j=0; j<i; j++)
                {
                    a[trow][tcol] = cnt;
                    tcol++;
                    cnt++;                                  ***1***
                    a[ttrow][ttcol] = tcnt;
                    ttcol--;
                    tcnt++;
                }
    
                trow=row+1;
                tcol=col+i-1;
                ttrow=row+i-2;
                ttcol=col;
                for(j=0; j<i-2; j++)
                {
                    a[trow][tcol] = cnt;
                    trow++;
                    cnt++;                                  ***2***
                    a[ttrow][ttcol] = tcnt; 
                    ttrow--;
                    tcnt++;
                }
    
    
                row++;
                col++;
                cnt=tcnt;
                tcnt=tcnt+2*(i-2)-2;
    
            }
            for(i=0; i<n; i++)
            {
                for(j=0; j<n; j++)
                {
                    printf("%d ", a[i][j]);
                }
                printf("
    ");
            }
    
        }
    
        return 0;
    }

    主要是两部分,如代码中的1,2部分
    1

    hey
    如红色标记所看到的。在这个for循环里。同一时候从上方、下方运动,直到数字填完

    2
    这里写图片描写叙述
    如红色标记,在这个for循环里,同一时候从左方、右方运动,直到数字填完

    通过1、2操作后,外层被填满,然后在内层继续填满,直到最后所有的数字所有填满。

    如图:
    这里写图片描写叙述
    我记得华中科技大学的复试编程题有相似的一题。

    2. 很态字符串回文序列长度

    题目大意:说实话,我都忘了详细怎么表述了,尽管过了一夜。大概就是给一个字符串。删除不必要的字符,求最大的回文字符长度。看到这一题。我的心里就像过电影似得。从脑中涌现各种想法。可是都貌似没啥用,后来想到一个想法就是:这样的试错的方法,可能会找到解法,可是时间效率很低。还是针对问题找解决方式。

    有点说胡话了,嘿嘿。
    后来想到一种方案,用的方法本质是基于动态规划的方法。
    採用的是从上往下的递归方法。由于从下往上没有找到起始,所以採用了从上往下的方法。

    f(s,e)=0,1,max(f(s,e)+1,f(s+1,e)),if s==e if s+1==e others

    代码:

    int fun(char *str, int s, int e, int *flag)
    {
            int i,j;
            int t1, t2;
            i=s;
            j=e;
            if(s==e)
            {
                *flag=0;
                return 0;
            }
            if((s+1) == e)
            {
                *flag=1;
                return 1;
            }
    
            t1=fun(str, s+1, e, flag);
            for(j=e-1;j>s;j--)
            {
                if(str[j] == str[s])
                    break;
            }
            if(j==s)
                t2=t1;
            else
                t2=fun(str,s+1,j, flag)+1;
    
            if(t1>t2)
                return t1;
            else
                return t2;
    
    }
    int main()
    {
        char str[100+1];
        int i,j, t;
        int flag;
        while(gets(str))
        {
            t= fun(str,0,strlen(str), &flag);
            if(flag==0)
                printf("%d
    ",2*t);
            else
                printf("%d
    ",2*(t-1)+1);
        }
        return 0;
    }

    flag代表是否包括回文中的单个元素。不包括对称元素,如aba中的b,flag假设是1,那么就是不包括单个元素,是偶数2*t, 否则为2*(t-1)+1。


    临时先写这么多。。。

  • 相关阅读:
    关于异步IO与同步IO的写操作区别
    慢慢开始记录一些技术心得吧
    写了placement new就要写placement delete
    关于针对class自定义new操作符失败的函数处理
    operator->和operator->*
    关于继承中的拷贝构造函数
    关于g++编译模板类的问题
    关于互斥锁,条件变量的内核源码解析
    关于sigwait
    观察者设计模式
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7352784.html
Copyright © 2011-2022 走看看