笔试题练习(六)
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;
}
?
總結
- 上一篇: 5月30日,社区活动:SharePoin
- 下一篇: 看似简单的问题 静态方法和实例化方法的区