首页 > 试题广场 >

一组有序数(从小到大排列),有负有正,找出绝对值最小值。(C

[问答题]

一组有序数(从小到大排列),有负有正,找出绝对值最小值。(CC++)

int i = 0;
while( a[i] < 0){
    i++;
}
if(a[i] + a[i-1] <= 0)
    return a[i];
else
    return a[i-1]; 

编辑于 2016-11-24 16:28:54 回复(2)
找到相邻两个异号的数字,选绝对值最小那个,O(n)吧,二分可能块一袋奶
发表于 2016-08-31 17:03:11 回复(0)
其实相当于二分查找0应该放在这个有序数组的位置,如果存在0,直接返回0的位置,如果0不存在,找到0应该放置的位置,然后比较0前后俩个数的绝对值就行。
发表于 2016-08-31 14:55:54 回复(0)
package main

import . "fmt"

// 一组有序数(从小到大排列),有负有正,找出绝对值最小值。(Go)

func findAbsMin(s []int) int {
	var i int = 0
	for s[i] < 0 {
		i++
	}
	if s[i]+s[i-1] <= 0 {
		return s[i]
	} else {
		return s[i-1]
	}
}

func main() {
	ss := []int{-4, -3, -2, -1, 1, 2, 3, 4, 5, 6}
	res := findAbsMin(ss)
	Printf("在切片%v中,绝对值最小的是: %v\n", ss, res)
}

发表于 2022-05-05 09:43:12 回复(0)

简单明了

public int minAbs(int[] a) {
    int lo = 0, hi = a.length-1;
    while(lo < hi) {
        int mid = (lo+hi)>>1;
        if(a[mid] < 0) {
            if(a[mid+1] < 0) lo = mid+1;
            else return Math.min(-a[mid], a[mid+1]);
        } 
        else {
            if(mid == 0) return a[mid];
            if(a[mid-1] >= 0) hi = mid-1;
            else return Math.min(a[mid], -a[mid-1]);
        }
    }
    return a[lo]; // 全负或全正
}
发表于 2020-12-09 14:42:20 回复(0)
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> p;
int num;
while(cin>>num)
p.push_back(num);
int result=0;
int start=0,end=p.size()-1,tempidx;
while(start<end)
{
tempidx=(start+end)/2;
if(tempidx==start)
{
if(abs(p[tempidx])<p[tempidx+1])
result=tempidx;
else
result=tempidx+1;
break;
}
if(p[tempidx]<0)
start=tempidx;
else if(p[tempidx]>0)
end=tempidx;
else
{
result=tempidx;
break;
}
}
cout<<p[result]<<" "<<result<<endl;
return 0;
}

发表于 2016-08-31 18:09:52 回复(0)
int getMin(vector<int> a, int n)
{
   assert(n > 0);
   if (a[0] >= 0) return a[0];
   if (a[n-1] <= 0) return (-1) * a[n-1];
   int l = 0;
   int r = n-1;
   int res = min((-1)*a[0], a[n-1]);
   while (l < r)
   {
     int m = (l + r) >> 1;
     if (a[m] > 0)
     {
       res = min(res, a[m]);
       r = m-1;
      }
     else if (a[m] < 0)
     {
       res = min(res, (-1)*a[m]);
       l = m+1;
      }
     else 
       return a[m];
   }
   return abs(a[l]);
}
   
o(logN)时间复杂度

发表于 2016-06-23 19:50:11 回复(1)
int g_errno=0;
int absmin(int *nums,int n)
{
    if(nums==NULL||n<=0)
    {
        g_errno=-1;
        return 0;
    }
    int first=0;
    int end=n-1;
    if(nums[first]>=0)
        return nums[first];
    if(nums[end]<=0)
        return -nums[end];
    while(first<end)
    {
        if(end-first==1)
            break;
        int mid=end-((end-first)>>1);
        if(nums[mid]<0)
            first=mid;
        else
            end=mid;
    }
    return -nums[first]<nums[end]?-nums[first]:nums[end];
}

发表于 2015-09-02 12:07:36 回复(0)
#include <stdio.h>
#include <vector>
using namespace std;

static int GetMin(const vector<int> &data, int begin, int end){
 //循环到只剩下两个相邻数字,或者整个序列都是相同符号
 if(end - begin == 1 || data[begin] * data[end] >= 0){
 return abs(data[end]) > abs(data[begin]) ? data[begin] : data[end];
 }

 int k = (begin + end) / 2;
 //对异号的序列查找
 if(data[begin] * data[k] > 0){
 return GetMin(data, k, end);
 }
 return GetMin(data, begin, k);
}

int FindAbsMin(const vector<int> &data){
 int m = GetMin(data, 0, data.size() - 1);
 printf("%d", m);
 return m;
}
int main(){
 vector<int> data;
 int Num[] = {-4,-3,-2,-1};
 for(int i = 0; i < sizeof(Num) / sizeof(Num[0]); ++i){
 data.push_back(Num[i]);
 }
 FindAbsMin(data);
 return 0;

}

发表于 2015-02-13 10:58:30 回复(0)
 //一组有叙数(从小到大排列),有负有正,找出绝对值最小值。(C或C++)
int findMinNum(int  nums[], int ilen)
{
    int iFirst = 0;
    int iSecond = 0;
    int iIndex = 0;
    for (; iIndex < ilen; iIndex++)
    {
        iFirst = nums[iIndex];
        iSecond = nums[iIndex + 1];
        if (iFirst < 0 && iSecond >= 0)
        {
            break;
        }
    }
    return (-iFirst > iSecond) ? iSecond : -iFirst;

}

int main ()
{
    int sss[] = { -4 - 3, -2, -1,  1, 2, 3, 6, 9 };
    int ss = findMinNum(sss,sizeof(sss)/sizeof(int));

    return 0;
}
编辑于 2015-02-05 11:40:34 回复(2)