精华内容
下载资源
问答
  • 有一千万条短信,有重复,以文本文件的形式保存,一行一条,有重复。 请用5分钟时间,找出重复出现最多的前10条。 分析: 常规方法是先排序,在遍历一次,找出重复最多的前10条。但是排序的算法复杂度最低为...
    有一千万条短信,有重复,以文本文件的形式保存,一行一条,有重复。

    请用5分钟时间,找出重复出现最多的前10条。


    分析:

    常规方法是先排序,在遍历一次,找出重复最多的前10条。但是排序的算法复杂度最低为nlgn。

    可以设计一个hash_table, hash_map<string, int>,依次读取一千万条短信,加载到hash_table表中,并且统计重复的次数,与此同时维护一张最多10条的短信表。

    这样遍历一次就能找出最多的前10条,算法复杂度为O(n)。


    实现如下:

    #include<iostream>
    #include<map>
    #include<iterator>
    #include<stdio.h>
    using namespace std;
    
    #define HASH __gnu_cxx
    #include<ext/hash_map>
    #define uint32_t unsigned int
    #define uint64_t unsigned long int
    struct StrHash
    {
            uint64_t operator()(const std::string& str) const
            {
               uint32_t b    = 378551;
               uint32_t a    = 63689;
               uint64_t hash = 0;
    
               for(size_t i = 0; i < str.size(); i++)
               {
                  hash = hash * a + str[i];
                  a    = a * b;
               }
    
               return hash;
            }
            uint64_t operator()(const std::string& str, uint32_t field) const
            {
               uint32_t b    = 378551;
               uint32_t a    = 63689;
               uint64_t hash = 0;
               for(size_t i = 0; i < str.size(); i++)
               {
                  hash = hash * a + str[i];
                  a    = a * b;
               }
                    hash = (hash<<8)+field;
               return hash;
            }
    };
    struct NameNum{
            string name;
            int num;
            NameNum():num(0),name(""){}
    };
    int main()
    {
            HASH::hash_map< string, int, StrHash > names;
            HASH::hash_map< string, int, StrHash >::iterator it;
            NameNum namenum[10];
            string l = "";
            while(getline(cin, l))
            {
                    it = names.find(l);
                    if(it != names.end())
                    {
                            names[l] ++;
                    }
                    else
                    {
                            names[l] = 1;
                            names[l] = 1;
                    }
            }
            int i = 0;
            int max = 1;
            int min = 1;
            int minpos = 0;
            for(it = names.begin(); it != names.end(); ++ it)
            {
                    if(i < 10)
                    {
                            namenum[i].name = it->first;
                            namenum[i].num = it->second;
                            if(it->second > max)
                                    max = it->second;
                            else if(it->second < min)
                            {
                                    min = it->second;
                                    minpos = i;
                            }
                    }
                    else
                    {
                            if(it->second > min)
                            {
                                    namenum[minpos].name = it->first;
                                    namenum[minpos].num = it->second;
                                    int k = 1;
                                    min = namenum[0].num;
                                    minpos = 0;
                                    while(k < 10)
                                    {
                                            if(namenum[k].num < min)
                                            {
                                                    min = namenum[k].num;
                                                    minpos = k;
                                            }
                                            k ++;
                                    }
                            }
                    }
                    i++;
    
            }
            i = 0;
            cout << "maxlength (string,num): " << endl;
            while( i < 10)
            {
                    cout << "(" << namenum[i].name.c_str() << "," << namenum[i].num << ")" << endl;
                    i++;
            }
            return 0;
    }
    
    使用g++编译如下:

    g++ main.cpp -o main

    短信文本文件为:msg.txt

    运行:./main < msg.txt

    输出结果为:

    maxlength (string,num): 
    (点点母婴坊,4)
    (农机配件维修,5)
    (红胜超市,6)
    (龙溪大酒店,8)
    (张记饺子馆,3)
    (友谊旅店,3)
    (明珠通讯,3)
    (金源旅馆,3)
    (洞庭山天然泉水,2)
    (清源超市,3)

    展开全文
  • 判断个小时之内是否重复发送了10次短信 并且是同个手机 每次发送短信,要写入当前时间戳到redis: String mobile="13718486139"; String time=String.valueOf(DateTimeUtil.getCurrentMillisecond...

    判断一个小时之内是否重复发送了10次短信

    并且是同一个手机

    每次发送短信,要写入当前时间戳到redis:

    String mobile="13718486139";
    		String time=String.valueOf(DateTimeUtil.getCurrentMillisecond());
    		RedisHelper.getInstance().saveKeyCache("limit_one_hour", mobile+"_"+time, time);

     

    检查时先获取所有时间戳:

    Map map=RedisHelper.getInstance().getAllKeyCache("limit_one_hour");

     

    具体判断逻辑:

    @Test
    	public void test_limitOneHour2(){
    		String mobile="13718486139";
    		int limitCount=5;
    		int limitTime=2*60;//两分钟
    		Map<String,String> map=new HashMap<String,String>();
    		map.put("13718486139_1445429819328", "1445431479437");
    		map.put("13718486139_1445429874699", "1445431485996");
    		map.put("13718486139_1445429874799", "1445431491527");
    		map.put("13718486139_1445430757886", "1445431496853");
    		
    		System.out.println(map);
    		List<Long>list=new ArrayList<Long>();
    		for(String key:map.keySet()){
    			if(key.startsWith(mobile)){
    				list.add(Long.parseLong(map.get(key))/1000);
    			}
    		}
    		SortList<Long>sortUtil=new SortList<Long>();
    		sortUtil.Sort(list, "longValue", "desc");
    		int length=list.size();
    		int toIndex=0;//要截取的最大序号
    		if(limitCount>length){
    			toIndex=length;
    		}else{
    			toIndex=limitCount;
    		}
    		List<Long>result=list.subList(0, toIndex);
    		long delter=list.get(0).longValue()-list.get(toIndex-1).longValue();
    		long delterSecond=delter;
    		System.out.println(delterSecond);
    		if(delterSecond<limitTime){
    			System.out.println("超限");
    		}else{
    			System.out.println("可以继续发短信");
    		}
    		System.out.println(result);
    	}
    	

     步骤:

    (1)把当前手机号的所有时间戳放入list中;

    (2)对list排序,按时间顺序,从大到小;(时间越大,表示离现在越近)

    (3)根据次数(limitCount)限制 来截取list;

    (4)计算list中第一个元素和最后一个元素的差量,即limitCount条短信的时间跨度delter

    (5)若delter 小于时间限制limitTime,则表示超过限制,那么禁止发送短信

     

     

    问题

    为什么要以这种方式存储到redis?

     "limit_one_hour" "13718486139_1445429819328" "1445431496853"

    而不是直接以手机号为key

    13718486139  "1445431496853"  ""

     

    因为:可能其他redis项是以手机号为key的,这样就会覆盖掉.即这样做有风险.

     

    不过如下方式可以:

    13718486139_limit_one_hour   "1445431496853"  ""

    展开全文
  • 判断个小时之内是否重复发送了10次短信(2) 可以先参考我上篇博客: http://huangkunlun520.blog.51cto.com/2562772/1705080 每次发短信,都写入redis: RedisHelper.getInstance().saveKeyCache("limit_...

    判断一个小时之内是否重复发送了10次短信(2)

    可以先参考我上一篇博客:

    http://huangkunlun520.blog.51cto.com/2562772/1705080

    每次发短信,都写入redis:

    RedisHelper.getInstance().saveKeyCache("limit_one_hour"+ip, "" + System.currentTimeMillis(), "");

     

    同时获取该ip对应的所有记录:

    ipMap = RedisHelper.getInstance().getAllKeyCache("limit_one_hour"+ip);

     然后删除掉超过一个小时的记录:

    protected Map<String, String> clearRecordsGreaterThanHour(Map<String, String> ipMap) {
    
            ArrayList<Long> t = new ArrayList<Long>();
    
            for (String k : ipMap.keySet()) {
    
                Long i = new Long(k);
                if (System.currentTimeMillis() - i.longValue() > 60*60*1000) {
                    t.add(i);
                }
            }
    
            for (Long i : t){
                ipMap.remove(i.toString());
            }
    
            return ipMap;
    
        }

     然后再判断 ipMap是否超过10条

    注意:此时ipMap 中的记录均是相比于现在一个小时之内的.

    这种思路与上一篇博客的思路完全不同.

     

    展开全文
  • return new BaseResponseDto(false, "a00001", "分钟之内不能重复发送手机短信").toJson(); } }   第次发送时lastSendSMSTime 为null,于是设置当前时间A 第二次访问时, lastSendSMSTime  不为null...

    直接上代码:

    String lastSendSMSTime=getKeyCache(request, response, mobile);
            if(StringUtil.isNullOrEmpty(lastSendSMSTime)){
            	saveKeyCache(request, response, mobile, String.valueOf(DateTimeUtil.getCurrentTimeSecond())/*1436319245*/);
            }else{
            	long lastSendSMSTimeSecond=Long.parseLong(lastSendSMSTime);
            	long currentTimeSecond=DateTimeUtil.getCurrentTimeSecond();
            	int delter=(int) (currentTimeSecond-lastSendSMSTimeSecond);
            	if(delter>60){//TODO  写入配置文件
            		saveKeyCache(request, response, mobile, String.valueOf(DateTimeUtil.getCurrentTimeSecond()));
            	}else{//a00001
            		return new BaseResponseDto(false, "a00001", "一分钟之内不能重复发送手机短信").toJson();
            	}
            }

     

    第一次发送时lastSendSMSTime 为null,于是设置当前时间A

    第二次访问时,lastSendSMSTime 不为null,获取其值,为时间A;

    同时获取当前时间B,计算时间A,和时间B 的差量delter.

    业务逻辑是:拿delter和60进行比较,如果delter>60,说明两次发短信的时间相差60秒,则允许发送,会重置时间为当前时间;

    若delter<=60秒,则允许发送,并且不会重置时间

     

    展开全文
  • 有1千万条短信,找出重复出现最多的前10条 解析:对于本题来说,某些面试者想用数据库的办法来实现:首先将文本导入数据库,再利用select语句某些方法得出前10条短信。但实际上用数据库是满足不了5分钟解决这个...
  • 手机记录表有100万多条数据,其中手机号有重复,并且手机记录表的数据还在不停的增加。 ...现要求做一个功能,可以给每个用户发一条促销短信(一个手机号只能发一条)。 求比较好的解决思路。
  • thinkphp发送短信的接口问题

    千次阅读 2016-12-06 14:27:26
    短信发送;防止短信重复发送;防止故意刷短信;短信加密。
  • 只能发一条,不能重复发送啊,重复发送就报端口被占用了。 package com.huanrong.util; import java.util.Enumeration; import java.util.LinkedList; import java.util.List; import javax.comm....
  • ​ 实现发送短信验证码的请求,要求5分钟之内重复请求,返回同个验证码。  如存储数据库或缓存中。实现起来比较麻烦,舍弃;另种方式即本例,使用session存储。其他方式,暂未进一步...
  • PDU短信发送

    千次阅读 2015-07-25 11:21:30
    AT指令收发短信主要有两种...PDU模式不仅能发送中文短信,也能发送英文短信。PDU收发短信有三种编码可用:7-bit、8-bit和UCS2编码。7-bit编码用于发送普通的ASCII字符,即英文短信,最多可发送160字符。8- bit编码通
  • 在调试期间,去讨论别的问题了,我自己收到多条短信同时,那些接受者账户也收到多条短信。短信接口会按着账户去查手机号码,如果接收者账户和接收者手机号码不一样,就会有两个人收到短信。 第二次:默认...
  • android 4.0版本手机接受多条短信分析

    千次阅读 2015-01-27 11:00:22
    实例:android4.0版本以及以前版本【信息】对比机发送一条短信,手机显示收到2条信息  测试机接受多条短信时,有时会接受到4,5条不定数目的短信信息。时间间隔不一。 2. 短信接受基本流程    分析一下流程
  • 限制分钟只能发送一次手机短信

    千次阅读 2015-10-11 21:36:39
    为什么要限制分钟之内只能发送一次手机短信呢? 防止恶意攻击. 什么场景需要发送手机短信? (a)手机号注册 (b)通过手机找回密码 (c)手机号绑定,手机号换绑 (d)转账时手机号接收动态口令(密)   1,前端...
  • Java SDK发送短信验证码

    千次阅读 2018-06-15 17:33:35
    上次记录了如何发送邮件,其实发送短信发送邮件差不多。只不过邮件是不收费的,发短信是要收费的。   这次就来说说怎么样发送短信验证码。   ▍实验条件   首先说明一下这篇文章所介绍的发送短信过程中...
  • 2.接口2的实现就是同步发送各种消息,比如发短信,微信等,但不保证 3.对外暴露接口2,供业务方调用 4.接口2内部实现,也是发送消息,但是是通过mq解耦的 4.1.业务方调用接口2后,接口2的实现将会发送一个topic; 4.2.发送...
  • 转载文章:超级终端调用短信发送短信说明 短信发送测试 1.短信收发说明命令说明: 1).设置短消息中心  AT+CSCA=“+8613800756500”回车(短信中心具体的号码由当地的运营商决定。移动的短信中心规则是...
  • 阿里云帮助中心:将短信发送频率限制在正常的业务流控范围内,默认流控:短信验证码:使用同个签名,对同个手机号码发送短信验证码,支持1/分钟,5/小时,累计10/天。 阿里云帮助中心链接
  • 接入阿里云短信接口1、打开短信服务2、添加签名3、添加模板4、启用 AccessKey ID 和 AccessKey Secret,用于调用 API 1、打开短信服务 https://www.aliyun.com/product/sms 2、添加签名 添加签名的时候一定要严格...
  • ASP.NET发送手机短信验证码

    万次阅读 2017-06-07 09:38:30
    我们在做网站尤其是用户注册时难免会用到使用手机号注册,给用户发送验证码用于效验身份。因为要用到给手机发送短信,所以...下面是实现方案:、web.config中需要增加短信发送接口: <!--短信发送接口--> ******"/>
  • android短信连发器

    2012-06-06 17:35:34
    向指定号码重复发送一条短信,可以从联系人中取号码。
  • 实现发送短信验证码

    2019-02-25 11:11:45
    作为个刚入行的java开发工程师,必须时刻学习新知识巩固已掌握的技能,...首先直接上图,发送短信验证码肯定是使用AJAX异步请求,这是前端页面,主要是所需要发送的手机号这参数 这是所发起的AJAX异步请求,这里进...
  • 易联挂机短信

    2013-09-22 23:04:03
    个字为一条短信,意思是70的话按一条收费,135个字的话就是按2条收费了, 这个意思类推,内容不要超过500字即可。短信内容任意设置:可以是联系方 式、服务范围、新品推荐、节日祝福、售后回访等内容) 6、所有来去...
  • 导致短信任务虽然只生成了一个,但是短信消费日志里面有两条消费记录(消费记录是按短信任务生成的,即一个任务一条消费记录)。 解决方法: 因为每次发送短信不管成功还是失败,都会生成想应的日志文件。所以每次...
  • 本文介绍的方法是对用户每天只能通过同一浏览器或同一ip地址获取验证码10次或者同一手机号只能获取3次短信验证码,三种限制为“或”关系,一条超限就不验证码。方法是通过在服务器端将用户的手机号、ip、ur_r记录...
  • 解决办法: 根据验证码长度限制输入框长度
  • 用EXCEL制作个生产企业全部员工三四百人的工资,要用多久?只需要5分钟,你信吗! 没有技术门槛,普通人也能学会软件开发,用自己做的企业管理软件减少大部分工作量,让工作更加效率,只要个开发工具! 用云表...
  • 安德斯在接受电话采访时说:“大多数短信的内容是短语或者个词,例如LOL和Hello等,然后就是无数次的重复发送”。 安德斯称,到3月底时他共发送了14万多条短信,柯林格则发送了7万多条,两人共计发送21.7万多条...
  • Spring Boot定时发送短信

    千次阅读 2019-01-16 22:13:17
    Spring Boot定时发送短信的两种方式 不少项目中估计都有遇到定时发送这个梗,我也遇到了,页面中下拉框选项有立即发送以及定时发送,立即发送就不用说了,定时发送可以讲一下,定时的方式有很多种,Java自带的定时器...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,365
精华内容 7,346
关键字:

一条短信同时重复发送