mysql中distinct的坑

本事例实验用表task,结构如下

 

 

 

1  Distinct 位置

单独的distinct只能放在开头,否则报错,语法错误

mysql>

 

 

现在把distinct放在开头

mysql>

 

查询成功

与其他函数使用时候,没有位置限制如下

 

 

这种情况下是正确的,可以使用。

2  Distinct用法

a.在count计算不重复的记录的时候能用到
比如

 

就是计算talbebname表中id不同的记录有多少条

b,在需要返回记录不同的id的具体值的时候可以用

比如

 

返回talbebname表中不同的id的具体的值

c.上面的情况2对于需要返回mysql表中2列以上的结果时会有歧义

比如

实际上返回的是player_id与task_id同时不相同的结果,也就是DISTINCT同时作用了两个字段,必须得player_id与task_id都相同的才被排除了,与我们期望的结果不一样,我们期望的是player_id不同被过滤

在这种情况下,distinct同时作用了两个字段,player_id,task_id

d.这时候可以考虑使用group_concat函数来进行排除,不过这个mysql函数是在mysql4.1以上才支持的
e. 其实还有另外一种解决方式,就是使用

 

虽然这样的返回结果多了一列无用的count数据(有时也许就需要这个数据)

f 同时我们还可以利用下面的方式解决b遇到的歧义问题通过group by 分组

distinct 优化

nginx.conf 说明

Nginx的配置文件nginx.conf配置详解如下:

 

 

Nginx用户及组:用户 组。window下不指定

 

 

工作进程:数目。根据硬件调整,通常等于CPU数量或者2倍于CPU。

 

 

错误日志:存放路径。

 

 

pid(进程标识符):存放路径。

 

 

指定进程可以打开的最大描述符:数目。

这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。

现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。

这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。

 

 

 

##设定http服务器,利用它的反向代理功能提供负载均衡支持

http

{

include mime.types;

设定mime类型,类型由mime.type文件定义

 

default_type application/octet-stream;

 

log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘

‘$status $body_bytes_sent “$http_referer” ‘

‘”$http_user_agent” “$http_x_forwarded_for”‘;

log_format log404 ‘$status [$time_local] $remote_addr $host$request_uri $sent_http_location’;

日志格式设置。

$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;

$remote_user:用来记录客户端用户名称;

$time_local: 用来记录访问时间与时区;

$request: 用来记录请求的url与http协议;

$status: 用来记录请求状态;成功是200,

$body_bytes_sent :记录发送给客户端文件主体内容大小;

$http_referer:用来记录从那个页面链接访问过来的;

$http_user_agent:记录客户浏览器的相关信息;

通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。

 

access_log  logs/host.access.log  main;

access_log  logs/host.access.404.log  log404;

用了log_format指令设置了日志格式之后,需要用access_log指令指定日志文件的存放路径;

 

server_names_hash_bucket_size 128;

#保存服务器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。如果hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键 值。因此,如果Nginx给出需要增大hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小.

 

client_header_buffer_size 4k;

客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。

 

large_client_header_buffers 8 128k;

客户请求头缓冲大小。nginx默认会用client_header_buffer_size这个buffer来读取header值,如果

header过大,它会使用large_client_header_buffers来读取。

 

open_file_cache max=102400 inactive=20s;

这个指令指定缓存是否启用。
例: open_file_cache max=1000 inactive=20s;

open_file_cache_valid 30s;

open_file_cache_min_uses 2;

open_file_cache_errors on;

 

open_file_cache_errors
语法:open_file_cache_errors on | off 默认值:open_file_cache_errors off 使用字段:http, server, location 这个指令指定是否在搜索一个文件是记录cache错误.

open_file_cache_min_uses

语法:open_file_cache_min_uses number 默认值:open_file_cache_min_uses 1 使用字段:http, server, location 这个指令指定了在open_file_cache指令无效的参数中一定的时间范围内可以使用的最小文件数,如果使用更大的值,文件描述符在cache中总是打开状态.
open_file_cache_valid

语法:open_file_cache_valid time 默认值:open_file_cache_valid 60 使用字段:http, server, location 这个指令指定了何时需要检查open_file_cache中缓存项目的有效信息.

 

 

client_max_body_size 300m;

设定通过nginx上传文件的大小

 

sendfile on;

sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。

 

tcp_nopush on;

此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用

 

proxy_connect_timeout 90;
后端服务器连接的超时时间_发起握手等候响应超时时间

 

proxy_read_timeout 180;

连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)

 

proxy_send_timeout 180;

后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据

 

proxy_buffer_size 256k;

设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小

 

proxy_buffers 4 256k;

设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k

 

proxy_busy_buffers_size 256k;

 

proxy_temp_file_write_size 256k;

设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长

 

proxy_temp_path /data0/proxy_temp_dir;

proxy_temp_path和proxy_cache_path指定的路径必须在同一分区

proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
#设置内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。

keepalive_timeout 120;

keepalive超时时间。

 

tcp_nodelay on;

 

client_body_buffer_size 512k;
如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小于256k的图片,都很正常。如果注释该指令,使用默认的client_body_buffer_size设置,也就是操作系统页面大小的两倍,8k或者16k,问题就出现了。
无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误

 

proxy_intercept_errors on;

表示使nginx阻止HTTP应答代码为400或者更高的应答。

 

upstream bakend {

server 127.0.0.1:8027;

server 127.0.0.1:8028;

server 127.0.0.1:8029;

hash $request_uri;

}

nginx的upstream目前支持4种方式的分配

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例如:
upstream bakend {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}

2、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
例如:
upstream bakend {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}

3、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backend {
server server1;
server server2;
fair;
}

4、url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

upstream backend {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}

tips:

upstream bakend{#定义负载均衡设备的Ip及设备状态}{
ip_hash;
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
在需要使用负载均衡的server中增加
proxy_pass http://bakend/;

每个设备的状态设置为:
1.down表示单前的server暂时不参与负载
2.weight为weight越大,负载的权重就越大。
3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
4.fail_timeout:max_fails次失败后,暂停的时间。
5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

nginx支持同时设置多组的负载均衡,用来给不用的server来使用。

client_body_in_file_only设置为On 可以讲client post过来的数据记录到文件中用来做debug
client_body_temp_path设置记录文件的目录 可以设置最多3层目录

location对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡

 

 

##配置虚拟机

server

{

listen 80;

配置监听端口

 

server_name image.***.com;

配置访问域名

 

location ~* \.(mp3|exe)$ {

对以“mp3或exe”结尾的地址进行负载均衡

 

proxy_pass http://img_relay$request_uri;

设置被代理服务器的端口或套接字,以及URL

 

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

以上三行,目的是将代理服务器收到的用户的信息传到真实服务器上

}

 

location /face {

if ($http_user_agent ~* “xnp”) {

rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;

}

proxy_pass http://img_relay$request_uri;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

error_page 404 502 = @fetch;

}

location @fetch {

access_log /data/logs/face.log log404;

rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;

}

location /image {

if ($http_user_agent ~* “xnp”) {

rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;

}

proxy_pass http://img_relay$request_uri;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

error_page 404 502 = @fetch;

}

location @fetch {

access_log /data/logs/image.log log404;

rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;

}

}

##其他举例

server

{

listen 80;

server_name *.***.com *.***.cn;

location ~* \.(mp3|exe)$ {

proxy_pass http://img_relay$request_uri;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

location / {

if ($http_user_agent ~* “xnp”) {

rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect;

}

proxy_pass http://img_relay$request_uri;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

#error_page 404 http://i1.***img.com/help/noimg.gif;

error_page 404 502 = @fetch;

}

location @fetch {

access_log /data/logs/baijiaqi.log log404;

rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect;

}

}

server

{

listen 80;

server_name *.***img.com;

 

location ~* \.(mp3|exe)$ {

proxy_pass http://img_relay$request_uri;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

location / {

if ($http_user_agent ~* “xnp”) {

rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif;

}

proxy_pass http://img_relay$request_uri;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

#error_page 404 http://i1.***img.com/help/noimg.gif;

error_page 404 = @fetch;

}

#access_log off;

location @fetch {

access_log /data/logs/baijiaqi.log log404;

rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect;

}

}

server

{

listen 8080;

server_name ngx-ha.***img.com;

location / {

stub_status on;

access_log off;

}

}

server {

listen 80;

server_name imgsrc1.***.net;

root html;

}

server {

listen 80;

server_name ***.com w.***.com;

# access_log /usr/local/nginx/logs/access_log main;

location / {

rewrite ^(.*)$ http://www.***.com/ ;

}

}

server {

listen 80;

server_name *******.com w.*******.com;

# access_log /usr/local/nginx/logs/access_log main;

location / {

rewrite ^(.*)$ http://www.*******.com/;

}

}

server {

listen 80;

server_name ******.com;

# access_log /usr/local/nginx/logs/access_log main;

location / {

rewrite ^(.*)$ http://www.******.com/;

}

}

location /NginxStatus {
stub_status on;
access_log on;
auth_basic “NginxStatus”;
auth_basic_user_file conf/htpasswd;
}

#设定查看Nginx状态的地址

 

location ~ /\.ht {
deny all;
}

#禁止访问.htxxx文件

}

 

注释:变量

Ngx_http_core_module模块支持内置变量,他们的名字和apache的内置变量是一致的。

首先是说明客户请求title中的行,例如$http_user_agent,$http_cookie等等。

此外还有其它的一些变量

$args此变量与请求行中的参数相等

$content_length等于请求行的“Content_Length”的值。

$content_type等同与请求头部的”Content_Type”的值

$document_root等同于当前请求的root指令指定的值

$document_uri与$uri一样

$host与请求头部中“Host”行指定的值或是request到达的server的名字(没有Host行)一样

$limit_rate允许限制的连接速率

$request_method等同于request的method,通常是“GET”或“POST”

$remote_addr客户端ip

$remote_port客户端port

$remote_user等同于用户名,由ngx_http_auth_basic_module认证

$request_filename当前请求的文件的路径名,由root或alias和URI request组合而成

$request_body_file

$request_uri含有参数的完整的初始URI

$query_string与$args一样

$sheeme http模式(http,https)尽在要求是评估例如

Rewrite ^(.+)$ $sheme://example.com$; Redirect;

$server_protocol等同于request的协议,使用“HTTP/或“HTTP/

$server_addr request到达的server的ip,一般获得此变量的值的目的是进行系统调用。为了避免系统调用,有必要在listen指令中指明ip,并使用bind参数。

$server_name请求到达的服务器名

$server_port请求到达的服务器的端口号

$uri等同于当前request中的URI,可不同于初始值,例如内部重定向时或使用index

docker环境下使用phpstorm进行xdebug调试代码。

docker部署后的lnmp架构图,以及xdebug的链路说明

docker xdebug lnmp

 

注意:
1. 需要php容器需要对外访问一个指定的xdebug接口(在php.ini的xdebug中配置好)

 

2. nginx的对应的配置里面,需要增加一个fastcgi_param  remote_addr

3. phpstrom的设置

 

 

开始调试前,需要把右上角的那个电话一样的按钮点击一下,变成截图的那样,然后在点臭虫按钮开始debug。。。。

 

安利下我已经部署好的docker环境(目前需要自己手动修改宿主ip,后续会优化成自动获取并替换):
https://github.com/mmfei/docker_php_nginx_mysql_redis_memcached

burp suite 使用 xssvalidate 进行自动化xss安全扫描

burp suite 使用 xssvalidate 进行自动化xss安全扫描

下载

https://portswigger.net/burp/releases/download?product=free&version=1.7.27&type=macosx

https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-macosx.zip

启动xss服务(这个必须有)

配置插件xssValidator

image_1bpb9uuess3713ehd5q1ang8d172.png-138.6kB

使用插件

代理功能(目的是抓取真实的http请求报文)

image_1bpb8n60024oueo1csr1c0vm5q2j.png-232kB

配置好浏览器代理地址后发起请求,burp会捕获到请求,点击forward

image_1bpb8q3271gmptv34cj1o151e9930.png-159.3kB

找到对应的请求历史记录,并发送到intruder

image_1bpb8tfd51mcudj71hh0dp41j83d.png-310.8kB

配置payloads为xssValidator

image_1bpb92n2c1ct91jue5iv1jvu1maa3q.png-213.3kB

配置options的grep – match

image_1bpb963drtho9qd4csgunet747.png-122.5kB

对应字符串的出处

image_1bpb8ikrd1coie1e1q87o73egk16.png-242.1kB

修改请求参数,并开始xss扫描

image_1bpb9apf3jm93ti1018ivf7fk51.png-178.9kB

查看单独的结果(有勾选的就是有xss漏洞的)

image_1bpb9epcjvhn1d6f1d0oqjs1mmj5e.png-217.8kB

把对话框出现的url地址copy到浏览器访问,并在显示的地址点击按钮

image_1bpb9ip6s1t7j47u1489ot1fdk5r.png-101.3kB
image_1bpb9lj5c3apc6ek1g18gchd56l.png-37.9kB

最后看到xss漏洞的现象

image_1bpb9k49e1551hcf9im40nfje68.png-133.3kB

win10 安装docker

install:
https://download.docker.com/win/stable/InstallDocker.msi

系统升级:
https://jingyan.baidu.com/article/0aa2237554a9db88cc0d64cf.html

bios开启硬件虚拟(intel的)

下载git:
http://download.csdn.net/detail/fanxiaobin577328725/9656336

garmin 520 使用地图导航

garmin 520导航:

1,先去 http://www.imxingzhe.com/lushu/ 行者路书里创建路书,需要先注册账号。

2,创建好路书后,在路书地图页面右上角点击导出按钮,把路书导出成*.gpx文件。

3,把garmin520用USB线连接上电脑,找到“NewFiles”文件夹,将导出的*.gpx文件放入。

4,推出Garmin520,重新启动。在菜单》训练》路线 中找到文件。文件第一次会显示成“行者骑行软件”,可以在码表内重新命名文件。

git常用命令

 

PHP面试题

最近帮公司出面试题,结果如下
选择题:

1、十进制数27对应的二进制数为( D )。

A.1011
B.1100
C.10111
D.11011

2、DNS的作用是__C___

A.为客户机分配IP地址
B.访问HTTP的应用程序
C.将域名翻译为IP地址
D.将MAC地址翻译为IP地址

3、下列排序算法中,哪些时间复杂度不会超过nlogn?(BC)

A.快速排序
B.堆排序
C.归并排序
D.冒泡排序

4、当n=5时,下列函数的返回值是:(A)

  1. int foo(int n)
  2. {
  3. if(n<2)return n;
  4. return foo(n-1)+foo(n-2);
  5. }

A.5
B.7
C.8
D.10

5、浏览器访问某页面,HTTP协议返回状态码为403时表示:(B)

A. 找不到该页面
B. 禁止访问
C. 内部服务器访问
D. 服务器繁忙

基础题:

1、表单中 get与post提交方法的区别? 【简单】

  1. 答:get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息.

2、session与cookie的区别? 【简单】

  1. PHP版本)
  2. session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(session_dir)的位置进行的存放
  3. cookie:用来存储连续訪問一个頁面时所使用,是存储在客户端,对于Cookie来说是存储在用户WINTemp目录中的。
  4. 两者都可通过时间来设置时间长短

3、数据库中的事务是什么? 【简单】

  1. 事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,
  2. 事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。

4、数据库题目,完成以下:

(一)创建新闻发布系统,表名为message有如下字段

  1. id 文章id
  2. title 文章标题
  3. content 文章内容
  4. category_id 文章分类id
  5. hits 点击量

答:

  1. CREATE TABLE 'message'(
  2. id int(10) NOT NULL auto_increment comment '文章id',
  3. title varchar(200) default NULL comment '文章标题',
  4. content text comment '文章内容',
  5. category_id int(10) NOT NULL comment '文章分类id',
  6. hits int(20) comment '点击量',
  7. PRIMARY KEY(id)
  8. )ENGINE=InnoDB DEFAULT CHARSET=utf8;

(二)同样上述新闻发布系统:表comment记录用户回复内容,字段如下 (4分)

  1. comment_id 回复id
  2. id 文章id,关联message表中的id
  3. comment_content 回复内容

现通过查询数据库需要得到以下格式的文章标题列表,并按照回复数量排序,回复最高的排在最前面

  1. 文章id 文章标题 点击量 回复数量

用一个SQL语句完成上述查询,如果文章没有回复则回复数量显示为0

答:

  1. SELECT message.id id,message.title title,IF(message.hits IS NULL,0,message.hits) hits,
  2. IF(comment.id is NULL,0,count(*)) number FROM message LEFT JOIN
  3. comment ON message.id=comment.id GROUP BY message.id;

(三)上述内容管理系统,表category保存分类信息,字段如下 (3分)

  1. category_id int(4) not null auto_increment;
  2. categroy_name varchar(40) not null;

用户输入文章时,通过选择下拉菜单选定文章分类
写出如何实现这个下拉菜单(可以用换行表示下拉)
答:

  1. # php版本,其他语言类似
  2. function categoryList()
  3. {
  4. $result=mysql_query("select category_id,categroy_name from category") or die("Invalid query: " . mysql_error());
  5. print("\n");
  6. while($rowArray=mysql_fetch_array($result))
  7. {
  8. print($rowArray['categroy_name']."\n);
  9. }
  10. }

5、用程序实现实现冒泡排序算法(语言不限);加分问题(聊一下冒泡排序的特点,答案:简单,消耗大。还有其他排序算法,快速排序,二分法排序等)

C语言版本冒泡

  1. //冒泡排序1 , 最简单完成
  2. void BubbleSort1(int a[], int n)
  3. {
  4. int i, j;
  5. for (i = 0; i < n; i++)
  6. for (j = 1; j < n - i; j++)
  7. if (a[j - 1] > a[j])
  8. Swap(a[j - 1], a[j]);
  9. }
  10. //冒泡排序2
  11. void BubbleSort2(int a[], int n)
  12. {
  13. int j, k;
  14. bool flag;
  15. k = n;
  16. flag = true;
  17. while (flag) //如果跑过一遍都没有交换过,说明已经排好序了
  18. {
  19. flag = false;
  20. for (j = 1; j < k; j++)
  21. if (a[j - 1] > a[j])
  22. {
  23. Swap(a[j - 1], a[j]);
  24. flag = true; //记录交换状态
  25. }
  26. k--;
  27. }
  28. }
  29. //冒泡排序3
  30. void BubbleSort3(int a[], int n)
  31. {
  32. int j, k;
  33. int flag;
  34. flag = n;
  35. while (flag > 0)
  36. {
  37. k = flag;
  38. flag = 0;
  39. for (j = 1; j < k; j++)
  40. if (a[j - 1] > a[j])
  41. {
  42. Swap(a[j - 1], a[j]);
  43. flag = j; //记录尚需排序的标志位
  44. }
  45. }
  46. }

Java

  1. /*
  2. * 冒泡排序
  3. */
  4. public class BubbleSort {
  5.   public static void main(String[] args) {
  6.     int[] arr={6,3,8,2,9,1};
  7.     System.out.println("排序前数组为:");
  8.     for(int num:arr){
  9.       System.out.print(num+" ");
  10.     }
  11.     for(int i=0;i<arr.length-1;i++){//外层循环控制排序趟数
  12.       for(int j=0;j<arr.length-1-i;j++){//内层循环控制每一趟排序多少次
  13.         if(arr[j]>arr[j+1]){
  14.           int temp=arr[j];
  15.           arr[j]=arr[j+1];
  16.           arr[j+1]=temp;
  17.         }
  18.       }
  19.     }
  20.     System.out.println();
  21.     System.out.println("排序后的数组为:");
  22.     for(int num:arr){
  23.       System.out.print(num+" ");
  24.     }
  25.   }
  26. }

php版本

  1. #冒泡排序法
  2. $arr = [12,45,89,3,24,55,223];
  3. $tmp;
  4. for($i=0;$i<count($arr)-1;$i++ ){ # 关键
  5. for($j=0;$j<count($arr)-1-$i;$j++){ # 关键
  6. if($arr[$j] > $arr[$j+1]){
  7. $tmp = $arr[$j];
  8. $arr[$j] = $arr[$j+1];
  9. $arr[$j+1] = $tmp;
  10. }
  11. }
  12. }
  13. print_r($arr); #关键,需要有输出

6、实现一个99乘法表(语言不限)

c实现

  1. #include<stdio.h> /*c语言打印九九乘法表*/
  2. int main()
  3. {
  4. int i,j;
  5. printf("九九乘法表如下:\n");
  6. for(i=1;i<10;i++)
  7. {
  8. for(j=1;j<=i;j++)
  9. printf("%d*%d=%-3d",j,i,i*j);
  10. printf("\n");
  11. }
  12. return 0;
  13. }

java实现

  1. /*
  2. * 对任务及求解方法的描述部分
  3. * 输入描述:
  4. * 问题描述:利用循环输出九九乘法表
  5. * 程序输出:输出九九乘法表
  6. */
  7. class Demo
  8. {
  9. public static void main(String[] args)
  10. {
  11. System.out.println("hello,java");
  12. System.out.println("九九乘法:");
  13. int x,y;
  14. for(x = 0;x <= 9; x++)
  15. {
  16. for(y = 1;y <= x; y++)
  17. {
  18. System.out.print(y+"*"+x+"="+x*y+"\t");
  19. }
  20. System.out.println();
  21. }
  22. }
  23. }

php实现

  1. for($j=1;$j<=9;$j++){
  2. for ($k=1;$k<=$j;$k++){
  3. $i=$j*$k;
  4. echo $k."X".$j."=".$i." ";
  5. } //内循环结束
  6. echo "<br />";
  7. }

在浏览器中输入网址后都发生了什么

  1. # 没有标准答案(面聊知道可以对方的知识栈和关注点)
  2. 浏览器 ->DNS -> IP(TCP/IP) -> 服务器(接入)->应用服务器->DB->应用服务器->服务器(接入)-> IP(TCP/IP;http头还有跳转之类的行为)->浏览器->前端渲染html(css,js)展示渲染结果->拉取资源(image,ajax)->展示