2008年6月

不要把自己的希望当观点
不要盲从别人的观点,你盲从的人有判断力吗,有目的吗,见识高吗,比你更跟的上时代吗,有的人连出租车司机的忽悠也当真
难道你想问理发师你需要理发吗
----------------------------------------------------

推荐一个财经类的好网站 http://www.create.hk/

找出字符串中最长连续重复字符串,重复次数一样情况下,重复单元长的优先,重复单元长度一样情况下排在前面的优先,举例如下
null->null
“”  -> ""
ab -> ab
aab -> a
aabbbc->b
aabbc->a
aa1212bc->12
我的代码如下,有点抽象哦
主函数入口 public string FindMostContinuouslyRepeatedString(string s)
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;

using PuzzleInterface;

namespace PuzzleSolution
{
    class CharPosInfo
    {
        public LinkedList PosList;
        public LinkedListNode CurBegNode;
        public CharPosInfo()
        {
            PosList = new LinkedList();
            CurBegNode = null; ;
        }

    };
    class CharPosTable
    {
        public CharPosInfo[] table;
        public int Count;
        public CharPosTable(string s)
        {
            table = new CharPosInfo[256];
            Count = s.Length;
            for (int i = 0; i < 256; i++)
            {
                table[(char)i] = new CharPosInfo();
            }
            char curCh;
            for (int i = 0; i < Count; i++)
            {
                curCh = s[i];
                table[curCh].PosList.AddLast(i);
            }
            for (int i = 0; i < 256; i++)
            {
                table[(char)i].CurBegNode = table[(char)i].PosList.First;
            }
        }
        public void SetRepeat(string s, ref Repeat rp,int begPos)
        {
            int startPos; int posOver,posStart;
            char ch; int v;
            LinkedListNode node;
            LinkedListNode rmNode;

            for (int k = 0; k < rp.ItemLen; k++)
            {
                 startPos = rp.PosInSrc + k;
                 ch = s[startPos];
                 CharPosInfo cpInfo = table[ch];
                 LinkedList tList = cpInfo.PosList;
     
                node = cpInfo.CurBegNode.Next.Next;
                posOver = (startPos) + rp.ItemLen * (rp.Times - 1);
                posStart=startPos + rp.ItemLen;
                while (node != null)
                {
                     v = node.Value;
                    if (v >= posOver)
                    {
                        break;
                    }
   
                    {
                        if ( v<= begPos )
                        {
                            cpInfo.CurBegNode = node;

                        }
                        if (v <= posStart)
                        {
                            node = node.Next;
                            continue;
                        }
                        rmNode = node;
                        node = node.Next;
                        tList.Remove(rmNode);

                    }

                };
            }

        }
        public int FindNextCharPos(char c, ref LinkedListNode cNode, int curPos ,int leastPos)
        {
 
            while (true)
            {
                if (cNode.Next != null)
                {
         
                    if (cNode.Next.Value <= curPos)
                    {
                        cNode = cNode.Next;
                        continue;
                    }
                    if (curPos  >leastPos)
                    {      
                        return -2;
                    }

                    return cNode.Next.Value;
                }
                else
                {
                    cNode = cNode.Next;
                    return -1;
                }
            }
        }

    }
   public  struct Repeat
    {
       public int Times;
       public int ItemLen;
       public int PosInSrc;
       public void Clear(){
           Times = 0;
           ItemLen = 0;
           PosInSrc = -1;
       }
    }

    public class Solution : IPatternRepetition
    {
        public static bool  StrEqual(string sA, int oA, string sB, int oB, int len)
        {
      
            for (int i=0; i < len; i++)
            {
                if (sA[oA + i] != sB[oB + i])
                {
                    return false;
                }
            }
            return true;

        }

        public static void GetRepeat(string s ,int sOffset, int nextOffset,ref Repeat rp)
        {
        //    Repeat rp = new Repeat();
            rp.Times = 1;
            rp.ItemLen = nextOffset - sOffset;
            rp.PosInSrc = sOffset;
            int slen = s.Length;
            int step = nextOffset;
            int stepOver =slen -rp.ItemLen;
            while (step <= stepOver)
            {
                if (StrEqual(s, sOffset, s, step, rp.ItemLen))
                {
                    rp.Times++;
                    step += rp.ItemLen;
                }
                else
                {
                    break;
                }
            }
        }
        public string FindMostContinuouslyRepeatedString(string s)
        {
            if (s == null ) return s;
            CharPosTable posTable = new CharPosTable(s);
            int slen = s.Length;
            if (slen < 2) return s;
            Repeat maxRepeat = new Repeat();
            maxRepeat.ItemLen = 1;  maxRepeat.PosInSrc = 0;  maxRepeat.Times = 1;
            char ch;
            Repeat rp = new Repeat();
            LinkedListNode cNode;
            for (int i=0; i < slen; i++)
            {
                ch = s[i];
                int curPos = i;
                cNode = posTable.table[ch].CurBegNode;
                while (cNode!=null)
                {
                    curPos = posTable.FindNextCharPos(ch, ref cNode, curPos,
                        ((slen - i) / maxRepeat.Times  + i));
                    if (curPos == -2) {
                        break;
                    }
                    rp.Clear();
                    if (curPos == -1)
                    {
                        rp.Times=1;
                        rp.ItemLen = s.Length - i;
                        rp.PosInSrc = i;
                    }
                    else
                    {
                        GetRepeat(s, i, curPos, ref rp);
                    }
                    if(rp.Times>2)  posTable.SetRepeat(s, ref rp,i);
                    if (rp.Times > maxRepeat.Times)
                    {
                        maxRepeat = rp;
                        continue;
                    }
                    if ((rp.Times == maxRepeat.Times) && (rp.ItemLen > maxRepeat.ItemLen))
                    {
                        maxRepeat = rp;
                    }
                   
                }
            }
            if (maxRepeat.PosInSrc >= 0)
            {    //    System.Console.WriteLine("Real:"+maxRepeat.Times + " " + s.Substring(maxRepeat.PosInSrc, maxRepeat.ItemLen /* maxRepeat.Times*/));
                return s.Substring(maxRepeat.PosInSrc, maxRepeat.ItemLen /* maxRepeat.Times*/);
            }
            return null;

        }
    }
}
公司内部的Puzzle活动,我提交的代码(原代码速度第二,这个是事后修改了一点,比第一快乐一点)

这一期的三联生活周刊介绍说很火 中国工程师去参加苹果公司开发者大会的已经达100多了 有不少挺赚钱的
有没有朋友了解或者感兴趣的 我们可以看看能否做什么东西有机会赚钱
http://developer.apple.com/iphone/

zz http://logicwin.blog.sohu.com/71800276.html

你的下属即将跳槽的8个征兆

在目下人才竞争愈演愈烈的情况下,保留人才是每个经理人和人力资源工作者的重要职责。
如果一个对公司或部门很关键的人把辞职报告摆到你的办公桌上,你才意识到他的重要性,那已经为时太晚。
通常,一个人做出辞职的决定是要经过长时间的深思熟虑、考察和论证,一旦提交辞呈,意味着他已经与另一家公司签了Offer,这时一般人不会因为公司的挽留而动心,因为他与另一家公司已经有了契约关系。
其实一个人离开公司前的1-3个月(对于经理人可能会长达6个月)里,一定会表现出不同以往的言语或行为,如果你仔细观察,就可以发现异常动向,提前采取稳定人和留人的措施。
1、对工作的积极性和主动性突然下降(No
proactiveness and initiative)。
一个一贯积极主动的人,突然变得消极被动,对什么事情都无所谓,这是很危险的信号。当一个人决定离开的时候,已经是‘人在曹营心在汉’,因此出于职业道德的约束,会继续做好已经启动的工作,但不会做任何需要长期的承诺的事情。
2、对公司的态度骤然变化(Attitude
toward the company changes)。
原来对公司牢骚满腹、意见多多,突然变得沉默寡言,别人议论公司也不参与。当一个人对公司有抱怨有意见的时候,他暂时不会离开,因为他还对公司抱有希望,希望有所改善。但是当他已经决定离开了,他对公司的改善也就不抱希望,或者是无所谓了。
3、表现低调(Appear invisible and
indifferent)。
在各种场合,表现得比过去低调,开会不发言、讨论不讲话、有任务不主动请缨、有矛盾不卷入。为了淡出公司,他不会再主动请缨担当任何新的项目,也不会启动长期的工作项目。
4、工作纪律散漫(Become
loose)。
并非所有人会这样。但在低级岗位的员工中会见到。一个一贯遵守工作纪律的人,突然出现一些迟到、早退、上班聊
天、上网等小毛病。既然要走了,在这个公司的表现就不那么重要了。但是,职业化的经理人往往能做到善始善终,原因一是职业素养使然,二是对于经理人,可能
会有背景调查(Reference
Check),会影响他能否拿到下一家公司的聘书(Offer)。
5、休长假(Take long paid
leave)。
申请休息一两个星期以上的假期。外企由于工作紧张,很少有能够休息10天半个月而工作不受影响的情况。如果一
个岗位可以空缺那么长时间,老板就要质问(Challenge),公司是否需要这个岗位?但是对于要走的人,一方面为了个人的跳槽,如到外地考察、准备和
参加面试等,另外因担心个人的带薪假可能在离开时得不到公司补偿,因此会长时间休息。
6、经常离开办公室接打手机(Receive
mysterious phone calls)。
跟对方公司的人事部或猎头通常是通过手机联系,接到这样的电话,该员工会神秘地快速离开办公室,走到僻静的场所接听。一般是安排面试、参观公司等事项。
7、到HR询问有关年终奖金和休假的政策(Check HR
policy regarding year-end bonus)。
各公司对于年终奖和带薪假有不同规定。例如有的公司规定,发放奖金时已经离职的人无权获得奖金;遗留未用的带薪假以工资补偿;而另一些公司则规定,凡是工作到上年度12月31日的人,来年2-3月发奖时,仍有资格享受年终奖。
8、作退出的准备(Prepared to
leave)。

流水账我就不记了。
Google和开发者走的比较近也比较开放,这一点从google中国黑板报和微软亚洲研究院官方博客的风格可以看出来。
今天主要三个主题:
App Engine 云计算
地图
手机Android
OpenSocial
云计算没听,现在好像还用不着。
地图API 设计的比较好 不过接口功能不够强大,最关键的地名到坐标的问题,经纬度飘移等关键问题没有什么帮助。大部分还是看文档就能掌握的(其实还是hack mabar或者51ditu好)
OpenSocal 是一个SNS接口标准和实现shindig 方便实现平台无关应用
手机听不太懂
期间还听了Adwords(可以自己做一些google广告管理分析工具)和Picassa API,这个可以在web开发上用到。
主要感想:
网络应用的互操作性加强了,其实可以让很多程序开发各种工具赚点小钱,也就是所谓的mushup或者轻量级应用的开发。不过这些和技术本质没有什么关系。更多是业界规范的发展。
欢迎大家有好的想法,我们一起来开发。

每周都有2,3个真实的朋友增加。今天一个出国的小妹妹也增加了(上次见她还是初中)
QQ就没这个效果,除非交换QQ号码(很久没告诉人QQ号码了)
不过MSN还是经常有人加(可能和名片 工作有关) 。

其实SNS对社会还是有贡献的 很多信息在朋友之间需要分享 。目前都是写邮件,博客和msn昵称分享。
不过封闭的一定社区是出路吗,email开放的特点目前还是用的最广的联系方式。

有多少建筑蕴含风险浪费成本
有多少书是言之无物耽误人的时间
有多少化妆品营养品毫无节制地夸大功效
有多少公司利润来路不当,不为社会贡献价值
忽悠和价值贡献活动的比例 就是泡沫程度的大小。
细心观察忽悠真是无处不在。个人,组织,政府,大家,自我,你我。

老毛病又犯了,真是人一但轻松下来就犯毛病啊。
ps:推荐一下 www.zoho.com  非常不错比google好用。除了个人应用之外 以后类似CRM HRM等东西都应该会有服务于中小企业的网络版。