第一篇博文,leetcode3道题

LeetCode做题笔记

  1. Add two numbers:给定一个数集合和一个数,已知集合中有两个数的和是给定数,求这两个加数的index

方法1:暴力,n^2时间复杂度,不推荐

方法2:快速排序nlogn。按集合里数的两倍与target的大小关系对分。对每一个第一部分的数,在另外一个部分二分搜索第二个数:500~ms

方法3:hash,n的时间复杂度,最高纪录420ms

方法3源码:

    public int[] twoSum(int[] numbers, int target) {
//index Map
        Map<Integer, Short> indexMap = new HashMap<>();
        int x;
//hash value and indices
for (short i = 0; i < numbers.length; i++){
    x = numbers[i];
if (indexMap.get(x) == null)
indexMap.put(x, i);
else {
if (target == x * 2){
return new int[] {indexMap.get(x) + 1, i + 1};
}
}
}
for (short i = 0; i < numbers.length; i++){
    x = numbers[i];
if (target != x * 2 && indexMap.get(target - x) != null){
int int1 = indexMap.get(x) + 1;
int int2 = indexMap.get(target - x) + 1;
if (int1 > int2)
return new int[] {int2, int1};
else {
return new int[] {int1, int2};
}
}
}
return null;
    }

经验1:对hashMap的get和put都是非常耗时间的,尽量少做

经验2:方法2最好使用随机化快排,效率很高

 

  1. 把两个链表表示的数加起来:最佳624ms,3%

用长一点的链表做基础,最多只需要new一个新节点

优化建议:进位尽量用数字。如果一个链到头了,另一个没到,应该沿着长链前进。如果进位是0就可以即刻返回,不需要继续前进。

源码:

public class Solution {
   public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
           int sum, progress = 0;
           ListNode tmp1 = l1, tmp2 = l2;
           for (;;){
                sum = l1.val + l2.val +progress;
                progress = sum >= 10 ?1 : 0;
               
                l1.val = l2.val = sum>= 10 ? sum - 10 : sum;
                if (l1.next == null){
                    if (l2.next == null){
                              if (progress ==1)
                                            l2.next= new ListNode(1);
                              return tmp2;
                    }
                    else {
                                         l2 =l2.next;
                                }
                    for (; ;){
                              if (progress ==0)
                                       returntmp2;
                              ++l2.val;
                              progress =l2.val >= 10 ? 1 : 0;
                              l2.val = l2.val>= 10 ? 0 : l2.val;
                             
                               if(l2.next == null){
                                       if(progress == 1)
                                                l2.next= new ListNode(1);
                                       break;
                              }
                              else
                                       l2 =l2.next;
                    }
                    return tmp2;
                }
                if(l2.next == null){
                          l1 = l1.next;
                          for (; ;){
                                   if(progress == 0)
                                            returntmp1;
                              ++l1.val;
                              progress =l1.val >= 10 ? 1 : 0;
                              l1.val = l1.val>= 10 ? 0 : l1.val;
 
                              if(l1.next == null){
                                       if(progress == 1)
                                                l1.next= new ListNode(1);
                                       break;
                              }
                              else
                                       l1 =l1.next;
                    }
                    return tmp1;
                }
                l1 = l1.next;
                l2 = l2.next;
                         
       }
    }
}

         经验2:leetcode不靠谱啊,速度不一定对

 

  1. 把一个整数数位逆转,注意符号,不能溢出

最好记录404ms,前5%

public static int reverse(int x) {
        StringBuilder string = new StringBuilder(x + "");
        int flag = 1;
        if (string.charAt(0) == ‘-‘){
        flag = -1;
        string.reverse().deleteCharAt(string.length()-1);
       
        }
        else {
        string.reverse();
}
        try{
        return flag == 1 ? Integer.parseInt(string.toString()) : -1 *Integer.parseInt(string.toString());
        }
        catch (Exception e){
        return 0;
        }
    }

经验3:类库比较快。而且好像早上/翻墙以后机器运算比较快?

官方提示:

To check for overflow/underflow, we could checkif ret > 214748364 or ret < –214748364 before multiplying by 10. On theother hand, we do not need to check if ret == 214748364, why? 溢出是2147483647,214748364乘10不溢出

时间: 2024-10-03 03:15:43

第一篇博文,leetcode3道题的相关文章

我的第一篇博文:输入法编程

这是我的第一篇博文,在这之前,我要介绍一下我自己.我是一名核电工程师,已经工作了19年,我同时也是一名计算机爱好者.我利用业余时间学习编程. 最近我研究了输入法的编程.我阅读了很多园里的文章,特别是借鉴了启程之星公开的客户端的源码.研究已经取得进展,可惜眼睛看坏了,现在不是很方便用计算机,所以等我眼睛好一些时候,我会更详细地介绍我研究的输入法的心得.我做的几件事如下: 1. 启程之星输入法源码的主要原理搞懂了.编译成功,知道主要部分的逻辑关系: 2. 研究了启程之星最近版与服务器通讯的原理(此部

这是我的第一篇博文,请大家多多关照!~

最近发现MDT推出去的系统的有不同问题,其问题就不说了,主要是策略权限被域继承了.比如我们手动安装的很多东东都是未配置壮态,推的就默认为安全壮态了,今天细找了一下,原来把这个关了就可以了. 这是我的第一篇博文,请大家多多关照!~,布布扣,bubuko.com

2015元旦第一篇博文:Red5流媒体服务器搭建

今天是2015年的第一天,白天陪老婆孩子去BHG(华联)转了转,中午在九毛九吃了顿午饭,就这样过了元旦,虽然有点累,但是挺开心,北京今天的天气也比较给力,风和日丽,没有雾霾!现在是晚上十点,因为白天出去玩,老婆孩子有点累,现在已经熟睡,我不想就这样就结束2015的第一天,作为一个新的开始,我决定写2015年的第一篇博文.闲话少说,进入主题.流媒体这个概念在第一家公司就了解了,当时做一个Eleaning在线教育平台的时候,用Red5流媒体服务器技术,支持过视频模块的播放.下面就谈谈我对流媒体的认识

第一篇博文:为自己加油

为自己加油 第一次在51CTO发表博文,四个字形容我和51CTO的关系"相见恨晚",今年才正式的了解和加入,并开始在51CTO学院学习在线课程.起步有点晚,也没有关系,找对了方向,一切都不晚. 来点抒情的正能量的文字,鼓励下自己,继续学习的动力. 改变才能更好的生存,学习是改变的最佳途径! 还有我最喜欢的一句哈佛名言:Thought is already is late,exactly is the earliest time ! 和大家一起共勉. 2014年05月09日 晚 20点4

我的第一篇博文

看着很多朋友都开通了自己的博客,在博客里写写画画蛮有意思,自己也开博了,原来的科学网博客太八卦了,以后长居博客园了. 试着写个数学公式 我的第一篇博文,布布扣,bubuko.com

我的第一篇博文--程序员的成长

如果你是一名程序员,那么我想恭喜你,你成为了为数不多的新型人类.程序员,在我看来,它是个很棒的代名词,但是想成为真正的程序员,很不容易,真的很累的. 每天挑代码到凌晨3,4点,这不是虚的,写了改,改了重写,查代码,测代码,找bug,反反复复,像是覆水难收. 现在,我得去上课去了,培训.回来继续 我的第一篇博文--程序员的成长

致我的第一篇博文

前言:敲代码也一定的时间了,所谓好记性不如烂笔头,所以大家快写自己的博文吧. 第一篇还真不知道如何下笔,感觉高中时期把自己肚子里的货全部都半空了,大学基本上就没出货了,追忆往事,我高中的文笔还是不错的,高考语文快130分了,一把辛酸一把泪,现在真是能憋死英雄汉. 所以文章还是要写的,现在入行程序员,项目上的一些积累还是需要整理的,自己平时学的东西啊,书籍啊,多写写笔记也是不错的,第一篇也不需要长篇大论什么的,开头就写给自己:现在的你水平有限,你要加油啊! ps:糖小宝,我爱你!我会加油的!

我的第一篇博文(Winfrom下WebBrowser控件的使用)

说实话来到博客园也得2年多了,可惜一片文章都没写过.只因今天心情很不好,决定趁工休时间写篇博文放松放松.文字真的是一件很神奇的东西,写出来了感觉心情会好很多.我现在有个想法就是把我总结的一些技术性的东西以后慢慢地放到博客园上来. 今天心情为什么心情不好呢,因为早晨我迟到了.这次迟到估计是我本月内第三次迟到了,好害怕公司通报啊.由于路上修路,今早得绕道.平时也就是20分钟的路程,今早居然用了40分钟.靠,为什么堵车啊,为什么总是在右转或者左转的时候那么堵.看红绿灯那么偏向直行的车,我真想踹门砸玻璃

第一篇博文

这既是我的第一篇文章,也是我准备养成不熬夜习惯的第一天. 每天11点半之前睡觉,自2015年1月21日(星期三)起. PS:如若违规,以红点标记,*. 第1周 星期一 星期二 星期三 星期四 星期五 星期六 星期日