笔试题练习(六)

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值