天天看點

筆試題練習(六)

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];

    return srcStr;

第二種方法就是利用空閑的’\0’字元占的位置作為中間變量,最後填補一個’\0’

    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';

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)

        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,如需轉載請自行聯系原作者

繼續閱讀