剑指Offer总结

剑指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都会溢出?也就是我们需要考虑大数问题,这就是面试官在这道题设置的一个大陷阱。
在字符串上模拟数字加法的解法,用字符串或者数组表达大数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值