剑指Offer
实现Singleton模式
public class Singleton
{
private static Singleton uniqueSingleton;
private static readonly object locker=new object();
//定义私有构造函数,使外界不能创建它
private Singleton()
{
}
public static Singleton GetInstance()
{
if (uniqueSingleton == null)
{
lock (locker)
{
if(uniqueSingleton==null)
uniqueSingleton=new Singleton();
}
}
return uniqueSingleton;
}
}
强烈推荐解法:利用静态构造函数,静态构造函数只调用一次,这样我们就能够保证只初始化一次instance.
二维数组中查找
数组的每一行每一列都是有序的,查找目标值
解法:首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数字,删除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。
替换空格
“We are happy.” 空格替换成"%20" 变成 “We%20are%20happy.”
犹豫把1个字符替换成3个字符,我们必须要把空格后面所有的字符都后移两个字节,否则就有两个字符被覆盖了。
我们换一种思路,把从前向后替换改成从后向前替换。
public static void ReplaceSpace()
{
var str = "We are happy.";
var result = str.Replace(" ", "%20");//Replace直接就达到结果
var originalLength = str.Length;
var blankCount = 0;
for (var i = 0; i < originalLength; i++)
{
if (str[i] == ' ')
blankCount++;
}
var newLength = originalLength + blankCount * 2;//替换之后的总长度
var targetStr = new char[newLength];
var indexOfOriginal = originalLength-1;
var indexOfNew = newLength-1;
while (indexOfOriginal >= 0 && indexOfNew >= 0)
{
if (str[indexOfOriginal] == ' ')
{
targetStr[indexOfNew] = '0';
indexOfNew--;
targetStr[indexOfNew] = '2';
indexOfNew--;
targetStr[indexOfNew] = '%';
indexOfNew--;
}
else
{
targetStr[indexOfNew] = str[indexOfOriginal];
indexOfNew--;
}
indexOfOriginal--;
}
//new string(targetStr);
}
从尾到头打印链表
解决这个问题肯定要遍历链表,遍历的顺序是从头到尾的顺序,可输出的顺序却是从尾到头,这就是典型的“后进先出”,我们可以用栈实现这种顺序。
重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
用两个栈实现队列
用两个栈实现一个队列。
旋转数组的最小数字
采用二分查找实现,时间复杂度是O(logn)
二进制中1的个数
数值的整数次方
打印1到最大的n位数
比如输入3,最大的3位数就是999,即打印出1到999
当输入的n很大的时候,我们求最大的n位数是不是用int或者long都会溢出?也就是我们需要考虑大数问题,这就是面试官在这道题设置的一个大陷阱。
在字符串上模拟数字加法的解法,用字符串或者数组表达大数。