2019年9月

1.png
输入格式:
输入在一行给出正整数N。

输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。

输入样例:
20
输出样例:
4

分析

在分析之前,小编先说下python的运行效率是真的不是很高,小编的算法优化了好几次才可以,最后的一个测试用例总是超时,20分的算法题只能拿18分,有强迫症的小编好难受,终于功夫不负有心人,完美解决。
大体的思路就是先判断素数,然后判断两个相邻的素数是否相差为2.
细节:

  • 偶数肯定不是素数。
  • 最小的素数对是3,5
  • 求素数的时候先开方,具体理由自己思考。

代码

18分的代码(经历就不说了)

#!/usr/bin/python
import math
n = input()

t = 1
jishu = 0

for num in range(2, n+1):
    chushu = math.sqrt(num)
    f = True
    for number in range(2, int(chushu)+1):
        if num%number==0:
            f = False
            break
    if f:
        if(num-t==2):
            jishu+=1
        t = num
print jishu

20分的

#!/usr/bin/python
import math
n = input()
def issushu(num):
    chushu = math.sqrt(num)
    for number in range(3, int(chushu)+1, 2):
        if num%number==0:
            return False
    return True

t = True
jishu = 0
for number in range(3, n-1, 2):
    t2=issushu(number+2)
    if t and t2:
        jishu+=1
    t = t2
print jishu

原题

让我们用字母 B 来表示“百”、字母 S 表示“十”,用 12...n 来表示不为零的个位数字 n(<10),换个格式来输出任一个不超过 3 位的正整数。例如 234 应该被输出为 BBSSS1234,因为它有 2 个“百”、3 个“十”、以及个位的 4。

输入格式:
每个测试输入包含 1 个测试用例,给出正整数 n(<1000)。

输出格式:
每个测试用例的输出占一行,用规定的格式输出 n。

输入样例 1:
234
输出样例 1:
BBSSS1234
输入样例 2:
23
输出样例 2:
SS123

分析

  1. 输入的是一个三位的正数,百位是几就输出几个‘B’,同样的十位是几就输出几个‘S’,各位是几我们就需要输出1到几。
  2. 所以我们第一步先求出每一位数字的大小,百位的时候,我们直接用这个数除以100,因为这都是int类型的数字之间的计算,得到的值也是int,所以求出的是百位的正数。十位数的计算类似,我们用输入的这个数减去算出来的百位数乘以100,然后除以10得到十位数字,同理得到个人位数字。

     百位 =n/100
     十位 =(n-百位*100)/10
     个位 = n-(百位*100-十位*10)
  3. python的指出字符串个数的做法,就是‘B’*百位个数即可,同理十位也一样,各位的我们通过循环来进行计算。
  4. 最后的输出我们减少字符串的拼接,采用的事%s替代的问题,提高性能。

代码实现

#!/usr/bin/python
n = input()
b = n/100
s = (n-b*100)/10
g = n-(b*100+s*10)
gnum = ''
for num in range(1,g+1):
    gnum = gnum+str(num)
print '%s%s%s' % ('B'*b, 'S'*s, gnum)

我们首先下载echarts微信版,下载地址为:https://github.com/ecomfe/echarts-for-weixin,然后我们把下载好的文件放在我们的小程序中,小编是建立了一个libs用来存储这些引用的库。

  • json文件中的配置:

    "usingComponents": {
          "ec-canvas": "/libs/ec-canvas/ec-canvas"
    }
  • js中引用

    let echarts = require('../../libs/ec-canvas/echarts.js');
  • wxml中使用

    <view style="width: 720rpx; height: 720rpx;">
        <ec-canvas  id="ec-accessdata" canvas-id="ec-accessdata" ec="{{echarts.addatatrend.option}}"></ec-canvas>
    </view>
  • 使用
    我们在data中定义echarts的初始化数据:

    echarts: {
              userdatafenbu: {
                  option: {
                      lazyLoad: true,
                  },
                  form: {
                      year: new Date().getFullYear()
                  }
              },
              addatatrend: {
                  option: {
                      lazyLoad: true
                  },
              }
    
          }
    option : {
              title: {
                  text: 'ECharts 入门示例'
              },
              tooltip: {},
              legend: {
                  data:['销量']
              },
              xAxis: {
                  data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
              },
              yAxis: {},
              series: [{
                  name: '销量',
                  type: 'bar',
                  data: [5, 20, 36, 10, 10, 20]
              }]
          };
    

    在函数里使用

    let that = this;
    let ec = that.selectComponent('#ec-accessdata');
                  if (!ec) {
                      return;
                  }
                  ec.init(function(canvas, width, height) {
                      // 获取组件的 canvas、width、height 后的回调函数
                      // 在这里初始化图表
                      const chart = echarts.init(canvas, 'wonderland', {
                          width: width,
                          height: height
                      });
                      chart.setOption(that.data.option);
                      // 注意这里一定要返回 chart 实例,否则会影响事件处理等
                      return chart;
                  });

原题

卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。

当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对 n=3 进行验证的时候,我们需要计算 3、5、8、4、2、1,则当我们对 n=5、8、4、2 进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这 4 个数已经在验证3的时候遇到过了,我们称 5、8、4、2 是被 3“覆盖”的数。我们称一个数列中的某个数 n 为“关键数”,如果 n 不能被数列中的其他数字所覆盖。

现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。

输入格式:
每个测试输入包含 1 个测试用例,第 1 行给出一个正整数 K (<100),第 2 行给出 K 个互不相同的待验证的正整数 n (1<n≤100)的值,数字间用空格隔开。

输出格式:
每个测试用例的输出占一行,按从大到小的顺序输出关键数字。数字间用 1 个空格隔开,但一行中最后一个数字后没有空格。

输入样例:
6
3 5 6 7 8 11
输出样例:
7 6

解题思路

  1. 遍历所有输入的数,求出每个数的覆盖数,去重之后保存在一个列表中。
  2. 遍历覆盖数,输入的数如果在覆盖数里面则删除,剩下的都是关键数了。
  3. 对关键数进行排序,输出。

Python2示例代码

#!/usr/bin/python
n = input()
s = raw_input()
s_list = s.split(" ")
s_list = [int(item) for item in s_list]
n_cover_list = []

for n in s_list:
    while n!=1:
        if n%2==0:
            n/=2
        else:
            n=((3*n)+1)/2
        if n not in n_cover_list:
            n_cover_list.append(n)

for item in n_cover_list:
    if item in s_list:
        s_list.remove(item)
s_str = ''
s_list = sorted(s_list, reverse=True)
for index in range(len(s_list)):
    s_str = s_str+str(s_list[index]) if index==0 else s_str+' '+str(s_list[index])
print(s_str)

1120483222.jpg

我们通常使用ssh连接到Linux服务器上查看一些文件或者查看数据库等,但是当我们遇到中文的时候就会经常的乱码,并且不能输入中文。
这种情况呢一般是终端和服务器的字符集不匹配,Mac下默认的是utf8字符集。所以我们的iterm2本地操作中文的时候是正常的但是通过ssh连接服务器之后就会乱码。
解决办法:
修改.zshrc这个文件

vi ~/.zshrc

在文件内容末端添加以下内容

export LC_ALL=en_US.UTF-8 
export LANG=en_US.UTF-8

输入echo "[ -r ~/.zshrc ] && source ~/.zshrc" >> .bash_profile使设置生效.
大功告成,如果不会使用vi编辑器,可以查看小编的其他文章哦。

设计思路:

  • 产生一个0到1的随机数
  • 循环遍历需要产生概率的列表,以及对应的概率列表
  • 判断随机数是否比第一个数小,小的话就直接返回,并且结束循环,否则就进行下次循环,现在可以肯定比上一个数大,所以让第一个概率加上第二个概率再和产生的随机数进行比较。以此类推。
    函数实现:

    import random
    
    def random_pick(some_list,probabilitie_list):
      x=random.uniform(0, 1)
      cumulative_probability = 0.0
      for item,item_probability in zip(some_list,probabilitie_list):
          cumulative_probability = cumulative_probability + item_probability
          if x < cumulative_probability:
              break
      return item

    参数说明:

  • some_list:求概率的列表
  • probabilitie_list:概率列表

测试函数:

i=0
while i<100:
    i+=1
    print random_pick(['a','b','c','d'],[0.4,0.2,0.3,0.1])

题目

读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。

输入格式:
每个测试输入包含 1 个测试用例,格式为
第 1 行:正整数 n
第 2 行:第 1 个学生的姓名 学号 成绩
第 3 行:第 2 个学生的姓名 学号 成绩
... ... ...
第 n+1 行:第 n 个学生的姓名 学号 成绩
其中姓名和学号均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。

输出格式:
对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。

输入样例:
3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
输出样例:
Mike CS991301
Joe

分析

  1. 输入是先确定输入几行,那么我们就需要先输入一个n,然后循环的输入n行。
  2. 我们需要把每一行输入的字符串处理成一个学生对象(字典),并且保存在一个列表中。
  3. 我们循环遍历这个列表,取出里面的最大值以及最小值,然后输出。

代码实现

#!/usr/bin/python
n = input()
i = 0

students = []
while i<n:
    student = {}
    i = i+1
    s = raw_input()
    std = s.split(" ")
    student['name'] = std[0]
    student['num'] = std[1]
    student['score'] = std[2]
    students.append(student)

max_student = students[0]
min_student = students[0]
for student in students:
    if int(student.get('score'))<int(min_student.get('score')):
        min_student=student
    if int(student.get('score'))>int(max_student.get('score')):
        max_student=student
print '%s %s' % (max_student.get('name'), max_student.get('num'))
print '%s %s' % (min_student.get('name'), min_student.get('num'))

对于一些很大的数字在前端显示的时候可能会不容易控制,而且对于一些很大的数字我们也不需要很精确的显示,这时候我们就需要把这个阿拉伯数字转换为汉字形式的了,并且保留一位小数就可以了。比如:12000我们可以显示为1.2万
我们之前说了下加逗号进行区分的方法,大家可以看下小编之前的文章。
我们来说下如何实现的吧

function makeFriendly(num) {
    if (num >= 100000000) {
        num = Math.round(num / 10000000) / 10 + '亿'
    } else if (num >= 10000) {
        num = Math.round(num / 1000) / 10 + '万'
    }
    return num;
}

nyroMd.jpg

题目

卡拉兹(Callatz)猜想:

对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……

我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?

输入格式:

每个测试输入包含 1 个测试用例,即给出正整数 n 的值。

输出格式:

输出从 n 计算到 1 需要的步数。

输入样例:

3

输出样例:

5

代码实现:

#!/usr/bin/python
n = input()
i = 0
while not n==1:
    i=i+1
    if n%2==0:
        n=n/2
    else:
        n=(3*n+1)/2
print i

小编使用python2实现的,可能不太适合使用python做算法题,但是仅提供一种解题思路吧,这是第一题,相对来说很简单。

首先我们先来了解下spu和sku这两个的概念。
spu:指的是商品,spu属性就是不会影响到库存和价格的属性, 又叫关键属性,与商品是一对一的关系。
sku:指的是具体规格单品,sku属性就是会影响到库存和价格的属性, 又叫销售属性,与商品是多对一的关系。
我们就拿小米9来举例子
小米9
机身颜色:全息幻彩蓝,深空灰,全息幻彩紫
存储容量:6+128G,8+128G,8+256G
spu就是指商品:小米9
sku就是指具体规格单品:全息幻彩蓝 8+128G等
sku一共有33=9个(机身颜色种类存储容量种类)

下面我们来设计模型
一般情况下我们使用5张表就可以解决基本的需求了:

  • 商品分类表:category
  • 商品表(即:spu表):product
  • 商品规格表(即:sku表):product_specs
  • 属性key表:attribute_key
  • 属性value表:attribute_value

商品分类表:category

  • 该表主要是描述商品的分类。
  • 属性:id,parent_id,name等

商品表(即:spu表):product

  • 存储商品信息
  • 属性:id,category_id,name,attribute_lise等

商品规格表(即:sku表):product_specs

  • 存储商品的具体规格单品,即sku
  • 属性:id,product_id,product_specs等

属性key表:attribute_key

  • 用于存储sku的属性,比如:机身颜色,存储容量

属性value表:attribute_value

  • 用于存储sku的属性值,比如:6+128G,8+128G,8+256G