检查字符串在javascript中是否包含3个或更多有序字符(无正则表达式)

检查字符串在javascript中是否包含3个或更多有序字符(无正则表达式),javascript,node.js,string,loops,Javascript,Node.js,String,Loops,正在查找可以检测字符串是否存在的代码 重复字符(sss,333,!!!) 和/或如果 按顺序包含后续字符,例如(345、efg、abc、789) 我知道他们使用正则表达式的存在方式,但我想知道是否存在只使用循环的算法 const str="abc123"; //loop through char to determine if it contains subsequent characters like abc... //str should return true //l

正在查找可以检测字符串是否存在的代码 重复字符(sss,333,!!!) 和/或如果 按顺序包含后续字符,例如(345、efg、abc、789)

我知道他们使用正则表达式的存在方式,但我想知道是否存在只使用循环的算法

const str="abc123";
//loop through char to determine if it contains subsequent characters like abc...
 //str should return true
//loop through char to determine if it contains repeated characters like bbb...
 //str should return false

可以使用JavaScript提供的charCodeAt函数。 您需要遍历字符串并比较它是重复字符还是有序字符

这里是链接

var str=“abc123”;
str=str.toLowerCase();
var len=str.length;
var a=str.charCodeAt(0);
var n=3;
var isRepeatingCharFound=false;
var isOrderedCharFound=false;
对于(变量i=0;i如果(i+(n-1)请考虑下面的代码,其中函数分析返回0或输入字符串中出现的最长序列的长度(最小为3)。在布尔表达式中,0将计算为false,任何其他数字将计算为true。我已创建了两个版本。在第一个版本中,您可以传递模式参数:

  • 1检查重复序列
  • 2检查后续的升序序列
  • 3检查后续降序序列
第二个版本结合了这三种模式,因此不需要模式参数。以下是第一个版本:

const str = "abc123";

function analyze(s, mode) {
  var count = 0, max = 0, diff, step;
  switch(mode) {
    case 1: step = 0; break; /* repeating */
    case 2: step = 1; break; /* subsequent: ascending */
    case 3: step = -1; break; /* subsequent: descending */
    default: step = 0;
  } 
  for (i = 0; i < s.length; i++) {    
    if (i > 0) {
      diff = s.charCodeAt(i) - s.charCodeAt(i - 1);
      if (diff == step) count++;
      if ((diff != step || i == s.length - 1) && count > 0) {
        max = Math.max(count + 1, max);
        count = 0;
      }
    }
  }
  return (max > 2 ? max : 0);
}

alert(analyze(str, 2));
const str=“abc123”;
功能分析(s,模式){
变量计数=0,最大值=0,差异,步长;
开关(模式){
案例1:步骤=0;中断;/*重复*/
案例2:步骤=1;中断;/*后续:升序*/
案例3:步骤=-1;中断;/*后续:下降*/
默认值:步长=0;
} 
对于(i=0;i0){
diff=s.charCodeAt(i)-s.charCodeAt(i-1);
if(diff==step)count++;
if((diff!=步长| | i==s.length-1)和&count>0){
最大值=数学最大值(计数+1,最大值);
计数=0;
}
}
}
返回(最大值>2?最大值:0);
}
警报(分析(str,2));
这是第二个版本:

var str = "aaxyzzzyxwv";

function analyze(s) {
  var count = 0, max = 0, mode_cur = 0, mode_prv = 0, diff;
  for (i = 0; i < s.length; i++) {    
    if (i > 0) {
      diff = s.charCodeAt(i) - s.charCodeAt(i - 1);
      switch(diff) {
        case 0: mode_cur = 1; break; /* repeating */
        case 1: mode_cur = 2; break; /* subsequent: ascending */
        case -1: mode_cur = 3; break; /* subsequent: descending */
        default: mode_cur = 0;
      } 
      if (mode_prv != mode_cur) count = 0;
      if (mode_cur) {
        count++;
        max = Math.max(count + 1, max);
      }
    }
    mode_prv = mode_cur;
  }  
  return (max > 2 ? max : 0);
}

alert(analyze(str));
var str=“aaxyzzyxwv”;
功能分析{
var计数=0,最大值=0,模式_cur=0,模式_prv=0,差异;
对于(i=0;i0){
diff=s.charCodeAt(i)-s.charCodeAt(i-1);
开关(差分){
案例0:模式\u cur=1;中断;/*重复*/
案例1:模式2;中断;/*后续:升序*/
案例1:模式\u cur=3;中断;/*后续:下降*/
默认值:mode_cur=0;
} 
如果(mode_prv!=mode_cur)计数=0;
如果(当前模式){
计数++;
最大值=数学最大值(计数+1,最大值);
}
}
模式_prv=模式_cur;
}  
返回(最大值>2?最大值:0);
}
警报(分析(str));

循环遍历索引。获取索引、索引+1和索引+2处的字符代码。然后检查这些代码是否连续。您可以使用
charCodeAt()
method.StackOverflow不是免费的编码服务。您需要这样做。请更新您的问题,以显示您在a中已经尝试过的内容。有关更多信息,请参阅,并点击:)