Skip to content

codewars-e3

题目1

- 题目

一个孩子在高层建筑的第n层玩球。这一层距离地面的高度,h,是已知的。

他从窗户扔下球。球会反弹(例如),达到其高度的三分之二(反弹系数为0.66)。

他的母亲从距离地面1.5米的窗户向外看。

母亲会在多少次看到球从她窗前经过(包括球下落和反弹时)?

进行有效实验必须满足的三个条件: 浮点参数 "h"(以米为单位)必须大于0 浮点参数 "bounce" 必须大于0且小于1 浮点参数 "window" 必须小于h。 如果以上三个条件都满足,返回一个正整数,否则返回-1。

注意: 只有当反弹后球的高度严格大于窗口参数时,才能看到球。

示例:

  • h = 3, bounce = 0.66, window = 1.5, 结果是 3

  • h = 3, bounce = 1, window = 1.5, 结果是 -1

(条件2不满足)。

我的解答: 与最佳实践一致

c
#include <math.h>
int bouncingBall(double h, double bounce, double window) {
    int count = -1;
    if(h>0 && bounce>0 && bounce<1 && window<h){
        while(h>window){
            count += 2;
            h = h*bounce;
        }
      return count;
    }
    return -1;
}

题目2

题目

你将会得到一个整数数组。你的任务是找到索引N,使得N左侧的整数之和等于N右侧的整数之和。

如果没有索引能满足这种情况,返回-1。

我的解答:

c
int find_even_index(const int *values, int length) {
  int sumr = 0, suml = 0;
  int p = length;
  while(p--) {
    sumr += values[p];
  }
  p = 0;
  while(p < length){
    if(p == 0){
      sumr -= values[0];
    }
    else if(p < length){
      suml += values[p-1];
      sumr -= values[p];
    }
    if(suml == sumr){
      return p;
    }
    p++;
  }
  
  return -1;
}

更好的解答:

c
int find_even_index(const int *values, int length) {
  int sum = 0;
  
  for(int i = 0; i < length; i++) sum += values[i];
  
  int left = 0;
  int right = sum;
  
  for(int i = 0; i < length; i++)
  {
    right -= values[i];
    if(left == right) return i;
    left += values[i];
  }
  return -1;
}

题目3

题目

编写一个方法,该方法接收一个连续(递增)的字母数组作为输入,并返回数组中缺失的字母。

你将始终获得一个有效的数组。并且始终只有一个字母缺失。数组的长度将始终至少为2。 数组将始终只包含单一大小写的字母。

示例:

['a','b','c','d','f'] -> 'e' ['O','Q','R','S'] -> 'P' (使用包含26个字母的英文字母表!)

我的解答:

c
char findMissingLetter(char array[], int arrayLength)
{
  for(int i=0; i<arrayLength; i++){
    if(array[i] + 1 != array[i+1]){
      return array[i]+1;
    }
  }
}

最简解答:

c
char findMissingLetter(char array[], int arrayLength)
{
    while (++*array == *++array);
    return --*array;
}