Tag Archiv: 编程

Leetcode 114. Flatten Binary Tree to Linked List

Leetcode 114. Flatten Binary Tree to Linked List

  题目意思很简单,就是把一棵二叉数转换为链表,虽然题目中没说以什么样的形式转换,但看下样例就很容易看出来,是以先序遍历的次序转换成链表。这里链表节点还是treenode,只不过它的左节点为空而已。
(more…)

Leetcode 368. Largest Divisible Subset

题目链接:368. Largest Divisible Subset

Given a set of distinct positive integers, find the largest subset such that every pair (Si, Sj) of elements in this subset satisfies: Si % Sj = 0 or Sj % Si = 0.
If there are multiple solutions, return any subset is fine.
  题目意思也很简单,给出一个不含重复数字的数组,找到最长的一个子数组,子数组里的元素必须两两整除。
(more…)

Leetcode 240. Search a 2D Matrix II

题目链接:Search a 2D Matrix II

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
Integers in each row are sorted in ascending from left to right.
Integers in each column are sorted in ascending from top to bottom.

  此题是74题Search a 2D Matrix的升级版,所给出的矩阵性质相对74题少了一条,只保证了每行和每列都是增序的,但依旧有O(m+n)的解法。

(more…)

Leetcode 74. Search a 2D Matrix

题目链接:Search a 2D Matrix

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
* Integers in each row are sorted from left to right.
* The first integer of each row is greater than the last integer of the previous row.

  这道题很简单,为此专门写篇博客其实算博客凑数了。给你一个每一行每一列都是增序,且每一行第一个数都大于上一行末尾数的矩阵,让你判断某个数在这个矩阵中是否存在。

(more…)

Leetcode 313. Super Ugly Number

Write a program to find the nth super ugly number.
Super ugly numbers are positive numbers whose all prime factors are in the given prime list primes of size k. For example, [1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32] is the sequence of the first 12 super ugly numbers given primes = [2, 7, 13, 19] of size 4.

原题链接:Super Ugly Number

(more…)

Leetcode 11. Container With Most Water

Given n non-negative integers a1, a2, …, an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.
Note: You may not slant the container.

原题链接:Container With Most Water

(more…)

萌妹子Python入门指北(五)

  这次我们来谈谈python中的函数,首先说一点,这里的函数和数学中的函数完全没有任何关系。在数学中,函数可能代表这一个数学公式,哎呀! 想想就头疼,但在程序猿的世界,函数就是实现某个功能的一段代码,比起for循环、if判断来说好理解多了。

(more…)

萌妹子Python入门指北(三)

  前两篇网站我简单介绍了python环境的安装和基本的变量及运算。到目前为止,我们没办法用python做任何事,所以这篇文章我会介绍python的判断和循环语句,据说顺序、判断、循环可以解决计算机中的任何问题。 我为什么不介绍顺序呢!因为很简单,其实就是python的每行代码按顺序执行。 其实python预发是相当容易看懂的,本文我会将示例代码翻译成汉语方便大家理解(翻译后的代码是不能执行的哦)。

(more…)

萌妹子Python入门指北(一)

《萌妹子Python入门指导》系列,以下简称萌妹子系列是教没有任何编程基础的妹子如何去写python代码,最终实现一些小工具的开发,请Python大牛们直接绕道。如果有想学习python的同学,也可以持续关注本系列。 本人在某互联网公司做运维,虽然python学的不是很好,但足以教一个完全不懂python的人,也希望在撰文的过程中提升自己的能力。

这是本系列第一堂课,主要介绍python为何物,以及python基础环境的安装,如果你已了解和安装了python,可直接跳过本文。

(more…)

Leetcode Single Number II (面试题推荐)


    还记得《剑指offer》和《编程之美》等书上多次出现的找一个数组中只出现一次的数那个题吗?

    leetcode也有这道题 链接here  相信大家都知道用异或在O(n)的时间复杂度内求出的方法,这里不再赘述。

下面就是上题的升级版

Given an array of integers, every element appears three times except for one. Find that single one.

Note:

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

   给你一个整数数组,每个元素出现了三次,但只有一个元素出现了一次,让你找出这个数,要求线性的时间复杂度,不使用额外空间。

   这样就不能使用异或的方法了,把所有元素以后得到的就是所有元素的异或值了,对我们没有任何帮助。

   这个问题依旧使用位运算来解决,不过更加复杂。

   我们用三个变量one two three,分别存储二进制未分别出现一次 两次 三次的位。

class Solution {
public:
    int singleNumber(int A[], int n) {
        int one = 0, two = 0, three = 0;
        for(int i = 0; i < n; i++)
        {
            three = two & A[i];                    //出现三次的位肯定是由出现两次的得到的
            two = two | ones & A[i];          //出现两次的肯定是出现一次的得到的,不过还有原有的所以要或
            one = one | A[i];                       //计算出现一次的位  
            two = two & ~three;               //去掉二进制中出现三次的位
            ones = one & ~three;               //去掉二进制中出现三次的位</span>
        }
        return one;                                     //最终twos three都为0,one就是我们要的答案
    }
};


http://regex.alf.nu/ 非标准答案


网站链接

这是一个练正则表达式的好文章,有几个题目都比较意思,以下是参考答案,如果有得分更高的答案请告诉我,大家交流一下。

  1. Plain strings (207)                             foo
  2. Anchors (206)                                     ick$
  3. Ranges (202)                                     [a-f]{4}
  4. Backrefs (201)                                   (…).*\1
  5. Abba (190)                                          ^((?!(.)(.)\3\2).)+$
  6. A man, a plan (176)                          ^(.)(.).*\2\1$
  7. Prime (286)                                        ^(?!(xx+)\1+$)
  8. Four (199)                                           (.)(.\1){3}
  9. Order (199)                                         ^.{5}[^e]?$
  10. Triples (574)                                       ^(([147]4|40|3[269]|9[05]|[378]1).+|0[369]*|[81][257])*$ 或 00($|3|6|9|12|15)|4.2|.1.+4|55|.17
     
    关于第10条,可参考 http://www.zhihu.com/question/24824487
  11. Glob (384)                                           (rr|ll|[lbr]o|en|ta|y|cr|eat|up).*\1
  12. Balance (287)                                    ^(<(<(<(<(<(<.*)*>)*>)*>)*>)*>)*$
  13. Powers (80)                                       ^(((x|x{8}|x{128})\3?)\2?)\1?$
  14. Long count (239)                              ((..)00 \2+01 \2+10 \2+11 ?){4}
  15. Long count v2 (239)                         ((..)00 \2+01 \2+10 \2+11 ?){4}
  16. Alphabetical (0)


http://jimliu.net/2014/01/04/regex-golf/

Ubuntu下python安装mysqldb(驱动)


最近在学习Django框架,需要使用到数据库,我使用的是mysql,跟java一样,需要安装驱动,这是驱动的下载网址http://sourceforge.net/projects/mysql-python/  要注意的是此网址已被墙,需要翻墙过去。

下载到压缩包后解压,然后执行安装命令

先跳转的该目录下,然后执行 sudo python setup.py install

然后就是各种问题,需要配置这个那个的。

其实

在终端中输入:sudo apt-get install python-mysqldb

然后一切OK,可以测试以下。

import MySQLdb


无报错就成功了

poj 1455 Crazy tea party

  这道题第一眼看去很难,其实不然,短短几行代码就搞定了。
  说一下大概思路,如果是排成一排的n个人,如 1 2 3 4 5 6 7 8 我们要变成 8 7 6 5 4 3 2 1 需要交换 28次,找规律的话就是 n*(n-1)/2,但这道题是一个圈,要让他们顺序变反的话不一定1要在8的位置上去,4 3 2 1 8 7 6 5 这样也是反的,我们只要把n个人分成两部分,然后按拍成一条线的方法来出来两部分就OK了。

(more…)

hdoj 4768 Flyer

题目意思很容易理解,学校有n个社团,每个社团只给编号从a到b 的发传单,而且只给隔了c的人发,问最后谁收到的传单是单数,输出他的编号和收到的传单数量。

昨天做这题的时候看见很多人过了,感觉不会很难,但是打死都想不出来,看了别人的思路,一下子就想通了。这里我简要说一下,用二分,我们可以很容易求出一段区间里的总的传单数,因为保证最多有一个是单数,我们就看单数在哪边。

下面是java代码,刚开始学java,代码不是很简洁。

import java.util.Scanner;

public class Main {
    static long[] a = new long[20005];
    static long[] b = new long[20005];
    static long[] c = new long[20005];
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        while (cin.hasNext()) {
            int n = cin.nextInt();
            for (int i = 1; i <= n; i++) {
                a[i] = cin.nextLong();
                b[i] = cin.nextLong();
                c[i] = cin.nextLong();
            }
            long r = Integer.MAX_VALUE, l = 0;
            while (l < r) {
                long mid = (l+r)>>1;
                long sum = 0;
                for (int i = 1; i <= n; i++) {
                    long minnum;
                    if (mid <= b[i])
                        minnum = mid;
                    else 
                        minnum = b[i];
                    if (minnum >= a[i]) {
                        sum += (minnum - a[i])/c[i] + 1;
                    }
                }
                if (sum%2 == 1)
                    r = mid;
                else l = mid+1;
            }
            if (l == Integer.MAX_VALUE) {
                System.out.println("DC Qiang is unhappy.");
                continue;
            }
            long ans = 0;
            for (int i = 1; i <= n; i++) {
                if (l >= a[i] && l <= b[i]) {
                    if ((l - a[i]) % c[i] == 0)
                        ans += 1;
                }
            }
            System.out.println(l + " " + ans);
        }
        cin.close();
    }
}