文档章节

一个很有意思的问题: 揭示了计算机程序问题的一般处理思路

FreeBlues
 FreeBlues
发布于 2013/08/21 18:43
字数 1310
阅读 345
收藏 4

一个很有意思的问题: 揭示了计算机程序问题的一般处理思路

===

问题标题: 如何统计汉字的字数? 问题内容: 我想统计: "什么样的问题在 oschina 算是一个好问题?" 这个句子里面以oschina为分割总共有三部分: 什么样的问题在+ oschina +算是一个好问题? 现在想知道oschina前面有几个汉字?oschina有几个英文?oschina后面有几个汉字?不要直接去查找oschina字符串去计算啊,可以当作oschina是某个未知的英文单词,如何统计出来呢? ps.楼下的说我的表达能力有问题,看来我确实没有表达清楚:)再补充一下问题。 问题来源: http://www.oschina.net/question/583303_122530

===

这个问题的关键是如何让计算机区分汉字和英文, 具体分析就要涉及到中文和英文在计算机内部的表示方式, 那么一切以数字为准, 先把这段数据转换为数字格式, 如下代码:

(defparameter *字符串*  "什么样的问题在 oschina 算是一个好问题?")

(defun 字符串-数字(字符串)
  (dotimes (序数 (length 字符串))
      (print (char-code (elt 字符串 序数)))))

执行一下, 结果如下:

CL-USER> (字符串-数字 *字符串*)

20160 
20040 
26679 
30340 
38382 
39064 
22312 
32 
111 
115 
99 
104 
105 
110 
97 
32 
31639 
26159 
19968 
20010 
22909 
38382 
39064 
65311 
NIL
CL-USER> 

我们看到, 每一个文字字符都被转化为一个数字值, 这个数字值就是计算机内部对这个字符的表示, 也就是说数字值和文字字符之间存在着一种对应关系. 其实到这里问题基本就解决一多半了, 剩下的就是对这些数字值的操作了.

更简单的语句是:

(defun 字符串-数字向量 (字符串)	
  (map 'vector #'char-code 字符串))

与前面第一个函数的区别是, 本函数返回的结果是一个向量, 试试看:

CL-USER> (字符串-数字向量 *字符串*)
#(20160 20040 26679 30340 38382 39064 22312 32 111 115 99 104 105 110 97 32 31639 26159 19968 20010 22909 38382 39064 65311)
CL-USER> 

再试试日文:

CL-USER> (字符串-数字向量 "日本语:平假名にほんご")
#(26085 26412 35821 65306 24179 20551 21517 12395 12411 12435 12372)
CL-USER> 	

现在就一目了然了, 这个句子也由适合人类阅读的形式转化为适合计算机阅读的数字形式了, 代码写到这一步, 程序员需要了解的知识就是人类和计算机之间的契约了, 如什么样的数字代表什么样的文字符号等等诸如此类的约定. 我们一般都知道:

0~127 之间的数字表示制表打印控制字符,英文大小写字符以及英文标点符号, 也就是 ASCII 
超过127 的数字表示中文字符和全角标点符号等(如果使用其他字符集, 那么就是其他字符, 如日文)

剩下的操作就是对数字的比较,分类等操作了.

这个问题给我们的启示就是, 首先要把问题的表述形式变化为计算机能理解的数字形式, 然后再去翻找人类和计算机之间已经签订好的契约, 然后按照契约的规定来分析处理.

目前写了两个函数, 简单区分了一下英文(0~127 的数字)和非英文(大于 127 的数字), 如下:

(defun 字数统计函数 (字符串)
  (let ((汉字个数 0) (空格个数 0) (英文字母个数 0) (全角问号个数 0) (代码点 0)) 
    (dotimes (序数 (length 字符串)) 
	 (setq 代码点 (char-code (elt 字符串 序数)))
	 (cond
	   ((= 代码点 32)
	    (setf 空格个数 (1+ 空格个数)))
	   ((= 代码点 65311)
	    (setf 全角问号个数 (1+ 全角问号个数)))
	   ((> 代码点 127)
	    (setf 汉字个数 (1+ 汉字个数)))
	   ((and (> 代码点 0) (<= 代码点 127))
	    (setf 英文字母个数 (1+ 英文字母个数)))))
    (values "空格个数:" 空格个数 "全角问号个数:"全角问号个数 "汉字个数:" 汉字个数 "英文字母个数" 英文字母个数)))

(defun 字数统计函数-映射版 (字符串)
  (let ((汉字个数 0) (空格个数 0) (英文字母个数 0) (全角问号个数 0)) 
    (map 'vector  
	 #'(lambda (代码点) 
	     (cond
	       ((= 代码点 32)
		(setf 空格个数 (1+ 空格个数)))
	       ((= 代码点 65311)
		(setf 全角问号个数 (1+ 全角问号个数)))
	       ((> 代码点 127)
		(setf 汉字个数 (1+ 汉字个数)))
	       ((and (> 代码点 0) (<= 代码点 127))
		(setf 英文字母个数 (1+ 英文字母个数)))))
	 (map 'vector #'char-code 字符串))
    (values "空格个数:" 空格个数 "全角问号个数:"全角问号个数 "汉字个数:" 汉字个数 "英文字母个数" 英文字母个数)))

执行结果如下:

CL-USER> (字数统计函数 *字符串*)
"空格个数:"
2
"全角问号个数:"
1
"汉字个数:"
14
"英文字母个数"
7
CL-USER> (字数统计函数-映射版 *字符串*)
"空格个数:"
2
"全角问号个数:"
1
"汉字个数:"
14
"英文字母个数"
7
CL-USER> 

© 著作权归作者所有

共有 人打赏支持
FreeBlues
粉丝 96
博文 279
码字总数 488537
作品 0
其它
程序员
计算机模型与体系架构的发展——从图灵机到云计算机(2)

图灵机模型从来就不考虑通信在计算中会有什么用处。正相反,图灵还就是偏偏提到过如果把两(多)部机器相连接使之互相通信,则连接好的机器与单个一部机器没有任何两样!所谓没有任何两样是指...

晨曦之光
2012/03/09
0
0
Android端支持HTTP和HTTPS

作者:近乎团队 Android端的网络模块在程序开发中是至关重要的,今天我们来分享下Android端如何使用http和https 技术。 1 HTTP (Hypertext transfer protocol) 超文本传输 协议 是一个基于请...

小近
2014/10/22
14.5K
4
使用 fasthttp 时要注意的两个点

我们做的是聚合支付系统,使用的是fasthttp 作为http server, http client 也是使用fasthttp 1. 第一个问题出现的场景是我们使用fasthttp client 请求微信支付时报了这个err ErrConnectionCl...

fireblue火蓝
2017/12/16
0
0
【99JS】之二:路径自动调整

 上一篇,99给大家介绍了使用js控制“:nth-child()”的方法,今天99继续给大家介绍一个使用js自动调整路径的相关介绍,希望大家喜欢。 目标: 路径自动调整 需求是这样的:在javascript 开发...

石佛慈悲
2014/01/03
0
0
2018-01-01 狗年的第一篇问题总结,URL不变的情况下,Glide加载图片不更新

序言 问题描述 触发条件 解决思路 查看glide缓存模块的wiki signature是什么 修改不了signature怎么办 总结 序言 发现这个问题源于17年最后一天的一个线上事故,昨晚八点多的时候后端哥们儿打...

fighting_goat
01/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【源码分析】面试问烂的equals和各种字符串、Integer比较

今天在空闲时间聊天时发现,面试题中的equals问题,以及String、Integer等的判等问题还是讨论的比较激烈而且混乱。。。(滑稽) 其实网上有非常多关于这种面试题的文章或者博客,其实多去看看就...

LinkedBear
7分钟前
3
0
jvm汇总

https://www.toutiao.com/i6490796229067276814/ https://tech.meituan.com/jvm_optimize.html

tantexian
8分钟前
0
0
限制MongoDB使用内存大小

限制MongoDB使用内存大小 0 收藏(6)因为MongoDB的内存是系统的虚拟内存管理的,MongoDB并不干涉内存管理工作,这样虽然可以简化Mongo的工作,但同时Mongo的内存使用是没法控制的。 真的没法控...

Airship
9分钟前
0
0
“赋能开发者”高峰论坛暨西安葡萄城30周年庆典隆重举办

 2018 年 10 月 18 日,“赋能开发者”高峰论坛暨西安葡萄城 30 周年庆典在古城西安隆重举办。   此次论坛由西安葡萄城信息技术有限公司(以下简称“西安葡萄城”)主办。作为软件开发行业...

葡萄城技术团队
10分钟前
0
0
聊聊storm的reportError

序 本文主要研究一下storm的reportError IErrorReporter storm-2.0.0/storm-client/src/jvm/org/apache/storm/task/IErrorReporter.java public interface IErrorReporter { void report......

go4it
11分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部