Jerry's Blog

Recording what I learned everyday

View on GitHub


7 August 2019

Database(5) -- Data Type and DDL

by Jerry Zhang

LeetCode Day 33: P204. Count Primes (Easy)

题目:

给一个非负整数n,求小于n的所有质数的个数。

思路:

常规思路会非常慢,小于n的数,每个数都需要检查它是不是素数,而检查的办法,就是看它的约数的个数,如果大于2,则不是素数。 这样时间复杂度就会是n^2

答案:

public class E_204_CountPrimes {
    public int countPrimes(int n) {
        if (n < 3)
            return 0;

        boolean[] f = new boolean[n];
        //Arrays.fill(f, true); boolean[] are initialed as false by default
        int count = n / 2;
        for (int i = 3; i * i < n; i += 2) {
            if (f[i])
                continue;

            for (int j = i * i; j < n; j += 2 * i) {
                if (!f[j]) {
                    --count;
                    f[j] = true;
                }
            }
        }
        return count;
    }
}

看了很长时间,甚至一步一步debug, 也没明白到底为什么这么做。重新看答案,原来用了一个方法叫Sieve of Eratosthenes。

埃拉托斯特尼筛法:

比如,求小于210的质数,就把从2开始,所有的数都列出来,然后挨个看:第一个数是2,于是就把210以内所有2的倍数都筛掉; 然后是3,于是就把210以内所有3的倍数都筛掉;然后剩下的是5,所有把210以内所有5的倍数都筛掉……

筛到17时,因为17的平方已经大于210,所以就不用再筛了。剩下的所有的数就是210以内的素数。

https://www.youtube.com/watch?v=GxoMWxXLKMc

public class E_204_CountPrimes {
    public int countPrimes(int n) {
		//默认值是false,如果是不是素数我们标为true
		//当然你也可以使用 Arrays.fill(f, true);  默认全设为true,如果不是素数我们设为false
		boolean s[] = new boolean[n];
		
		//如果n小于3的话就没有  因为找到n以内  所以2以内是没有的
		if(n < 3)return 0;
		
		//c 可以理解为最多的素数个数
		//以为我们知道所有的偶数都不是素数,所有我们可以剔除一半
		//但是你可能会有疑问 2 不是偶数吗   --> 这里 2 和 1 相抵消
		//比如 5 以内的话  5 / 2 = 2 素数就为 2 和 3
		//首先我们假设 小于 c 的奇数全是素数
		int c = n / 2;

		// 之后我们只要剔除 在这个奇数范围内 不是素数的数就可以了
		// 因为我们已经把偶数去掉了,所以只要剔除奇数的奇数倍就可以了
		for(int i = 3; i * i < n; i += 2) {
			//说明 i 是不是素数,而且已经是剔除过的
			if(s[i])
				continue;
			
			//这里是计算c 中剔除完不是素数的奇数个数  下面解释各个值的含义
			//我们要剔除的是 i 的 奇数倍
			//为什么是 i * i开始呢   我们打个比方,假设我们此时i = 5
			//那么我们开始剔除  j = 1 时就是本身,此时要么已经被剔除,要么就是素数,所以 1 不考虑
			//当 j = 2 || j = 4时,乘积为偶数所以也不在我们考虑范围内
			//当 j = 3时,我们考虑 3 * 5 但是这种情况已经是当 i = 3的时候被考虑进去了所以我们只要考虑之后的就可以了
			
			//那么为什么 j = j + i * 2呢
			//根据上面所说 我们从3开始考虑 3 * 3,3 * 5,3 * 7....只要 j < n 我们就剔除
			//带入i : i * i, i * ( i + 2 ) , i * ( i + 4 )....
			for(int j = i * i; j < n; j+= i * 2) {
				//只要找到c个奇数中的合数,c就减1,把 j标记为非素数
				if(!s[j]) {
					s[j] = true;
					c --;
				}
			}
		}
		return c;
	}
}

Database:

Data Types

Character Strings

Bit Strings

Boolean

TRUE, FALSE, UNKNOWN

Integer

INT or INTEGER, SHORTINT

Floating-point numbers

FLOAT, REAL, DOUBLE

DECIMAL(n, d) allows values that consist of n decimal digits, with the decimal point assumed to be d positions from the right. NUMERIC is similar.

Dates and times

Dates and Times

DATE ‘1984-05-14’

TIME ‘15:00:02.5’

Create a table

CREATE TABLE Movies(
    title       CHAR(100),
    year        INT,
    length      INT,
    genre       CHAR(10),
    studioName  CHAR(30),
    producerC#  INT
);

Delete a table

DROP TABLE R;

Modify a table

ALTER TABLE t ADD phone CHAR(16);
ALTER TABLE t DROP birthdate;

Default Values

gender CHAR(1) DEFAULT '?',
birthdate DATE DEFAULT DATE '0000-00-00'

Declaring Keys

Two ways:

a) PRIMARY KEY: null is not allowed B) UNIQUE: null is allowed

CREATE TABLE  MovieStar (
    name CHAR(30) PRIMARY KEY ,
    address VARCHAR(255),
    gender CHAR(1),
    birthdate DATE
);

AES Encrypt and Decrypt

SELECT HEX(AES_ENCRYPT("HelloWorld","new retail"));

SELECT AES_DECRYPT(UNHEX("799531CA0BEB4078163F10BD4D081DDC"),"new retail");
tags: Database