笔试题练习(六)
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();
}
}
}
*
* @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;
}
{//不申请变量和空间反转字符串
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;
}
{//不申请变量和空间反转字符串
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;
}
{
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;
}
作者:洞庭散人
出处:http://phinecos.cnblogs.com/
本博客遵从Creative Commons Attribution 3.0 License,若用于非商业目的,您可以自由转载,但请保留原作者信息和文章链接URL。
posted on 2009-05-27 21:18 Phinecos(洞庭散人) 阅读(813) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
2008-05-27 基于Mozilla Thunderbird的扩展开发(八)---进程间通信之Socket篇(续)
2008-05-27 《UNIX网络编程 卷2》读书笔记(二)
2006-05-27 《Java编程思想》读书笔记(2)