如何高效地解决这个问题(http://codingbat.com/prob/p168357)'codingbat'的例子?

时间:2016-11-20 05:58:08

标签: java logic

我在codingbat.com上遇到过这个问题:Problem

问题:

给定一个int数组,如果数组包含两个相邻的7,则返回true,或者有两个7由一个元素分隔,例如{7,1,7}。

has77([1,7,7])→true

has77([1,7,1,7])→true

has77([1,7,1,1,7])→false

我解决了,但我的方法效率不高。与问题相比,我的解决方案的代码很大。任何人都可以告诉我如何以聪明的方式解决这个问题。

我的代码:

public boolean has77(int[] nums) {
  int i = 0;
  int arraylength = 0;
  while(i != nums.length){
    if(nums[i] == 7){
      arraylength++;
    }
    i++;
  }
  int[] sevens = new int[arraylength];
  if(arraylength == 0){
    return false;
  }
  i =0;
  int j = 0;
  while(i != nums.length){
    if(nums[i] == 7){
       sevens[j] = i;
       j++;
    }
  i++;
 }
 i = 0;
 while(i != arraylength-1){
     if(sevens[i+1] - sevens[i]==1 || (sevens[i+1]- sevens[i]==2)){
      return true;
 }
i++;
}
 return false;
 }

3 个答案:

答案 0 :(得分:1)

这个答案将告诉你如何这样做,但不会给你代码。编写代码是为了让您自己做,因为您选择接受CodingBat上的挑战。

更高效的解决方案:只迭代一次数组。如果当前元素是7,而前一个元素或之前的元素也是7,则返回true

答案 1 :(得分:0)

我终于破解了这个问题。 这是代码:

struct Item
{
        char name[21];
        double price;
        int quantity;
        int minimum_qty;
        _Bool is_taxed;
};

struct Item enterItem(int sku)
{
        struct Item item;

        printf("        SKU: %d", sku);
        printf("       Name: "); scanf("%20[^\n]", item.name);
        clearKeyboard();                     // Function call to remove'\n'
        printf("      Price: ");
        item.price = getDouble();            // Function call to get user input in double
        printf("   Quantity: ");
        item.quantity = getInt();            // Function call to get user input in int
        printf("Minimum Qty: ");
        item.minimum_qty = getInt();
        printf("   Is taxed: ");
        item.is_taxed = getYesOrNo();        // Function call to get user input in bool > (Y)es or (N)o

        return item;    
}

答案 2 :(得分:0)

尝试一下:-

public boolean has77(int[] nums) {
  for(int i=0;i<=nums.length-2;i++){
    if(nums[i]==7&&nums[i+1]==7)
    return true;
    for(int j=0;j<nums.length-2;j++){
       if(nums[j]==7&&nums[j+2]==7) 
       return true;
    }
  }
  return false;
}