欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JS不使用替换进行替换

程序员文章站 2022-07-14 07:59:18
...

JS不使用替换进行替换

  首先我们从题意中可以读出:“不能使用比较、查找、替换”函数,也就是说我可以使用分割、组合方法。

于是我写出了如下代码:

  var str = "我喜欢南极和北极,喜欢荒漠大戈壁";
  str = str.split('');
  console.log(str.join(''));
  for(var i=0;i<str.length;i++){
  	var temp = str[i]+str[i+1];
  	if(temp=="喜欢"){
  	  str[i]="讨";
  	  str[i+1]="厌";
  	}
  }
  console.log(str.join(''));

 这里就不多做赘述了,两两组合在一起,如果组合后等于“喜欢”,那就替换为“讨厌”,之所以添加到数组中是方便组合数组,如果不添加数组,组合数组和字符串的话又增加了一层难度。输出结果是这样的:
JS不使用替换进行替换


  那,我们来读一读第二问:
以上程序是否总能正常输出,如果不能,列出哪种情况下无法正常输出结果,尽可能详细和全面。
  那,读到这里我就明白了:这道题是没有准确答案的,你只要写出来任何一种,就能得分,你编写的程序越完善,得分就越高。
  而我刚刚写下的这种方法有明显的弊端,那就是每次更换字符串,我都需要重新编写程序,于是我写下了第二种:

  var str = "我喜欢南极和北极,喜欢荒漠大戈壁";
  var ent = "喜欢";
  var out = "讨厌の";
  str = str.split('');
  console.log(str.join(''));
  for(var i=0;i<str.length;i++){
  	var temp = "";
  	for(var j=0;j<ent.length;j++){
  	  temp+=str[i+j];
  	}
  	console.log(temp);
  	if(temp===ent){
  	  for(var k=0;k<ent.length;k++){
  	  	str[i+k]=out[k];
  	  }
  	}
  }
  console.log(str.join(''));

  优化的结果是:无论需要被替换的字符串B有多长,我都可以用C进行替换,多余的B会被 “” 空字符所代替。但这套程序也有一个十分明显的弊端,于是我又写下了:不能,如果C 的长度大于B ,只能替换掉C长度的B,之后我开始写第三种方案:

  var str = "我喜欢南极和北极,喜欢沙漠大戈壁";
  var ent = "我喜欢";
  var out = "我没见过";
  console.log(str);
  str = str.split('');
  // console.log(str);
  for(var i=0;i<str.length;i++){
    var temp ="";
    for(var k=0;k<ent.length;k++){
      temp += str[i+k];
    }
      // console.log(temp);
    if(temp===ent){
      for(var j=0;j<ent.length;j++){
        str[i+j] = out[j];
        if((j+1)>=ent.length){
          for(var l=j+1;l<out.length;l++){
            // l=j+1 因为str[i+j]中已经存入了一个字符out[j]
            str[i+j] += out[l];
          }
        }
      }
    }
  }

JS不使用替换进行替换


  这次的方案看上去比较完美,基本无懈可击,但我在C里面加入了\n,我发觉它换行了,于是我写下了这样一段话:能正常输出,但不要定义这样的字符串"换行\n",在我看来,所有的程序都难以十全十美,只有熟练掌握JS脚本语言,才能适应飞速发展的前端,各种框架类层出不穷,组件日新月异,唯有熟读脚本语言,能编写各种算法,才能算是真正的博览群书。

我很幸运,得到了面试官的赏识,至于第二题,我用高中数学求出来了一些数值,但是具体的坐标我无能为力,最后因为学历问题,我与该企失之交臂,有遗憾也有收获,我把第二题的一些浅见写在这里,如果感兴趣,可以阅读:

JS不使用替换进行替换
  因为绕Z轴旋转,而不是随意旋转,可以断定Z2=Z3,如果对这点有异议,可以参照前端的transform:rotateX();transform:rotateY();transform:rotateZ();
  又因为x轴和y轴屏幕投影为30°,所以角cab=30°,如果对这点有异议,可以参照“搜狗问问”“知乎”“百度文库”,若不服可以在评论去骂街;
  因为∠cab=30° ,所以sinA=1/2,那线段bc的长度是ac的一半,而ac与ab相等,因此 ab = ac = 2bc;
  根据三角函数,a²+b²=c²,我能求出BC的长,那AB的长我也得出来了;
现在已知A点坐标与B点坐标,又已知线段AB、BC、CA的长度,且已知C点在Z轴上的坐标,且∠cab=30°、根据三角形内角和180°,且等边等角原理,可知∠abc = ∠acb = 75°,那么请求出 C 点的坐标,可以把写法留言在评论区,本人常在。
JS不使用替换进行替换