在排序数组中找给定数字出现的次数和任意整数有几种分解方法
2017-04-02 21:27
351 查看
1. 题目: 在排序数组中,找出给定数字的出现次数,时间效率越高越好,比如 [1, 2, 2, 2, 3] 中2的出现次数是3次。
输入:
1,2,2,2,3
输出:
1(1)
2(3)
3(1)
解题思路:
要求效果越高越好,所以用二分查找的方法分别找出给定数字的开始和结束位置,最坏情况下时间复杂度为O(logn)。
实现代码:
2. 题目:求出任意一个整数的分解方法有几种?
示例:
1:共有0种分解方法。
2:共有0种分解方法。
3: 3=2+1,共有1中分解方法。
4: 4=3+1=2+1+1,共有2种分解方法。
5: 5=4+1=3+2=3+1+1+1=2+2+1=2+1+1+1,共有5种方法。
。。。
依次类推下去。
如:
输入:1
输出:0
输入:2
输出:0
输入:3
输出:2
输入:6
输出:7
实现代码:
注: 这两道题是2017腾讯前端开发实习生招聘的编程题。
PS:这两道题的解法还有其他的方法,如果你觉得有必要,可以给本人留言或者联系本人哦!
输入:
1,2,2,2,3
输出:
1(1)
2(3)
3(1)
解题思路:
要求效果越高越好,所以用二分查找的方法分别找出给定数字的开始和结束位置,最坏情况下时间复杂度为O(logn)。
实现代码:
//方法一:使用二分查找算法,效率较高。 #include<stdio.h> #include<stdlib.h> #define n 5 int getUpper(int arr[], int key,int size){ int low = 0, high = size - 1; while(low < high){ int mid = (low + high + 1) / 2; if(arr[mid] <= key) low = mid; else high = mid - 1; } return low; } int getLower(int arr[], int key,int size){ int low = 0, high = size - 1; while(low < high){ int mid = (low + high) / 2; if(arr[mid] >= key) high = mid; else low = mid + 1; } return low; } int main(){ int i; int arr ; for(i=0; i<n ; i++){ scanf("%d,",&arr[i]); } int size = sizeof(arr) / sizeof(*arr); for(i = 0; i < size; i ++){ if( (i!=0) && arr[i] == arr[i-1] ){ continue; } printf("%d(%d)\n",arr[i],getUpper(arr,arr[i],size) - getLower(arr,arr[i],size) + 1); } getchar(); } //方法二:没有指定数组的长度,同时也没有使用二分查找算法 #include <stdio.h> int main(){ int i,j,k,t,n,a[100],b[100],c[100]; n=0; while( scanf("%d,",&a ) != EOF){ n++; } i=0,j=0,k=0,t=-1; while(i<n){ if(a[i]!=a[i+1]||i==n-1){ b[j]=a[i]; c[j]=i-t; j++; t=i; } if(i==n-1) break; i++; } for(i=0;i<j;i++) printf("%d(%d)\n",b[i],c[i]); return 0; }
2. 题目:求出任意一个整数的分解方法有几种?
示例:
1:共有0种分解方法。
2:共有0种分解方法。
3: 3=2+1,共有1中分解方法。
4: 4=3+1=2+1+1,共有2种分解方法。
5: 5=4+1=3+2=3+1+1+1=2+2+1=2+1+1+1,共有5种方法。
。。。
依次类推下去。
如:
输入:1
输出:0
输入:2
输出:0
输入:3
输出:2
输入:6
输出:7
实现代码:
#include <stdio.h> #include <stdlib.h> #define MIN(X,Y) (((X)<(Y))?(X):(Y)) int str=0; void WriteBuffer(const int * buffer){ while (buffer[1] != 0){ *buffer++; } } void Split(int * buffer, const int x, const size_t pos){ int i; if (x <= 1){ buffer[pos + 1] = x; buffer[pos + 2] = 0; WriteBuffer(buffer); str++; } else{ size_t npos = pos + 1; for (i = 1; i <= MIN(x, buffer[pos]); i++){ buffer[npos] = i; Split(buffer, x - i, npos); } } } void SplitNumber(const int x){ int i; if (x <= 0) return; int * buffer = (int*)malloc(sizeof(int) * (x + 1)); for (i = 1; i < x; i++){ buffer[0] = i; Split(buffer, x - i, 0); } } int main(){ int i,x = 0; while(scanf("%d",&x)!=EOF){ if(x==1||x==2){ printf("0\n"); continue; } else{ int count=0; for(i=2;i<x;i++){ if(x%i==0){ count++; } } SplitNumber(x); printf("%d",str-1-count); str=0; } } return 0; }
注: 这两道题是2017腾讯前端开发实习生招聘的编程题。
PS:这两道题的解法还有其他的方法,如果你觉得有必要,可以给本人留言或者联系本人哦!
相关文章推荐
- 在排序数组中,找出给定数字的出现次数.比如 [1, 2, 2, 2, 3] 中2的出现次数是3次。
- 在排序数组中,找出给定数字的出现次数
- 在排序数组中,找出给定数字的出现次数
- 如何在排序数组中,找出给定数字出现的次数
- 微软面试题:在排序数组中,找出给定数字的出现次数
- [微软面试题] 在排序数组中,找出给定数字的出现次数
- 在一个排序数组中,输出给定数字出现的次数
- 在排序数组中,找出给定数字出现的次数
- 10、在排序数组中,找出给定数字出现的次数
- 在排序数组中,找出给定数字的出现次数
- 在排序数组中,找出给定数字的出现次数
- 在排序数组中,找出给定数字的出现次数
- PHP实现统计一个数字在排序数组中出现次数的方法
- 【js实现】在排序数组中,找出给定数字的出现次数,比如 [1, 2, 2, 2, 3] 中2的出现次数是3次
- 在排序数组中,找出给定数字的出现次数
- 在排序数组中,找出给定数字的出现次数
- 在排序数组中,找出给定数字出现的次数。比如【1,2,2,2,3】中2的出现次数为3次
- 如何在排序数组中,找出给定数字出现的次数
- 【二分查找】在排序数组中,找出给定数字的出现次数 以及二分其他应用
- 在排序数组中,找出给定数字的出现次数 比如 [1, 2, 2, 2, 3] 中2的出现次数是3次。