笔试题练习(六)

简介:
1,输入N, 打印 N*N螺旋矩阵

比如 N = 3,打印:

1 2 3

8 9 4

7 6 5

N = 4,打印:

1   2   3   4

12 13 14 5

11 16 15 6

10 9   8   7

复制代码
/**
 * 
 * @author phinecos
 * @since 2005-05-27
 */
public class test 
{
    private static int n;
    private static int[][] array;
    private static int current = 1;

    public static void fill(int m)
    {
        if (current >= n*n)
        {//递归结束条件
            return;
        }
        int i;
        //上
        for (i = n-m; i < m; ++i)
        {
            array[n-m][i] = current++;
        }
        //右
        for (i = n-m+1; i < m-1; ++i)
        {
            array[i][m-1] = current++;
        }
        //下
        for (i = m-1; i >= n-m; --i)
        {
            array[m-1][i] = current++;
        }
        //左
        for (i = m-2; i >= n-m+1; --i)
        {
            array[i][n-m] = current++;
        }
        //进入下一层
        fill(m-1);
    }
    public static void main(String[] args) throws Exception
    {
        n = 10;
        array = new int [n][n];
        fill(n);
        if (n%2 == 1)
        {//奇数层次,补充中心点
            array[n/2][n/2] = n*n;
        }
        for (int i = 0; i < n; ++i)
        {
            for (int j = 0; j < n; ++j)
            {
                System.out.print(array[i][j]);
                System.out.print('\t');
            }
            System.out.println();
        }
    }
}
复制代码
2,要求:不申请变量和空间反转字符串,用一个函数实现。

第一种解法就是不使用变量交换两个数的两种方法

复制代码
char* reverseString(char* srcStr)
{//不申请变量和空间反转字符串
    if (srcStr == NULL || strlen(srcStr) == 0)
    {
        return NULL;
    }
    if (strlen(srcStr) == 1)
        return srcStr;
    for (int i = 0,j = strlen(srcStr)-1; i < j ; ++i,--j)
    {
        //第一种交换方式,可能会溢出
        //srcStr[i] = srcStr[i] + srcStr[j];
        //srcStr[j] = srcStr[i] - srcStr[j];
        //srcStr[i] = srcStr[i] - srcStr[j];
        //第二种交换方式,可能会溢出
        srcStr[i] = srcStr[i] ^ srcStr[j];
        srcStr[j] = srcStr[i] ^ srcStr[j];
        srcStr[i] = srcStr[i] ^ srcStr[j];
    }
    return srcStr;
}
复制代码
第二种方法就是利用空闲的’\0’字符占的位置作为中间变量,最后填补一个’\0’

复制代码
char* reverseString(char* srcStr)
{//不申请变量和空间反转字符串
    if (srcStr == NULL || strlen(srcStr) == 0)
    {
        return NULL;
    }
    if (strlen(srcStr) == 1)
        return srcStr;
    for (int i = 0,j = strlen(srcStr)-1; i <= j ; ++i,--j)
    {
        srcStr[len] = srcStr[i];
        srcStr[i] = srcStr[j];
        srcStr[j] = srcStr[len];
    }
    srcStr[len] = '\0';
    return srcStr;
}
复制代码
3,把一个32位的数按位反转

复制代码

unsigned int bit_reverse(unsigned int n)
{
    n =((n >> 1)& 0x55555555)|((n << 1)& 0xaaaaaaaa);
    n =((n >> 2)& 0x33333333)|((n << 2)& 0xcccccccc);
    n =((n >> 4)& 0x0f0f0f0f)|((n << 4)& 0xf0f0f0f0);
    n =((n >> 8)& 0x00ff00ff)|((n << 8)& 0xff00ff00);
    n =((n >> 16)& 0x0000ffff)|((n << 16)& 0xffff0000); 
    return n;
复制代码
4,将给定的一个整数转换成字符串

复制代码
char* IntToString(int num)
{
    int count = 0;
    bool isNegative = false;
    if (num < 0)
    {
        num = -1 * num;
        isNegative = true;
        ++count;
    }
    int tmp = num;
    while (tmp != 0)
    {
        ++count;
        tmp /= 10;
    }
    char* result = new char[count+1];
    if (isNegative == true)
    {
        result[0] = '-';
    }
    int i = count;
    while (num != 0)
    {
        result[--i] = num % 10 + '0';
        num /= 10;
    }
    result[count] = '\0';
    return result;
}
复制代码


本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2009/05/27/1491114.html,如需转载请自行联系原作者


目录
相关文章
|
网络协议 Java 调度
笔试题总结
32位机器上,以下结构的sizeof(P)为 struct A { int a; char b; int c; char d; } struct P { struct A w[2]; short b; struct A* p; } /*考察结构体对齐和填充: 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如果不是,编译器会自动在成员间填充。
949 0
|
Java
笔试题解答
/** * @author shishusheng * @date 2018/8/22 23:35 */ import java.util.
846 0
|
算法 机器学习/深度学习 BI
|
机器学习/深度学习 搜索推荐 索引