青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
021742
心要存高遠,行才有信心!
C++博客
首頁
新文章
聯系
聚合
管理
posts - 3, comments - 28, trackbacks - 0
一道算法面試題,大家討論看看
題目:
從1到N(100000)中任意拿掉兩個數,把剩下的99998個數順序打亂,并且放入數組A中。要求只掃描一遍數組,把這兩個數找出來。可以使用最到不超過5個局部變量,不能用數組變量,并且不能改變原數組的值。
思路:
遍歷一次數組,求出這兩個數的和a+b 與積a*b
a+b = 1+2+3+4+...+N- sum(A[]);??? (1)
a*b =? 1*2*3*4*...*N / multi(A[]);?? (2)
主要解決sum與multi的溢出問題
(1) 可化為 (N-A[0]) + (N-1-A[1]) + ...+ (3-A[N-3]) + 2 + 1
(2) 可以用對數來代替原數進行求積的等價運算,避免溢出的問題,但是這種方法會產生一些精度上的問題,不知道大家有什么更好的方法!
先求出log(a*b)?:
?????????????????????????= log(1*2*3*4*....*N)/log(A[0]*A[1]*A[2]*...*A[N-3])
?????????????????????????= log(N)-log(A[0]) + log(N-1)-log(A[1]) + ... +log(3)-log(A[N-3]) + log(2) + log(1)
?????????
知道了兩數的和與積,由此就可以計算出a跟b的值來.
代碼如下:
#include?
<
iostream
>
#include?
<
Ctime
>
#include?
<
Cmath
>
using
?
namespace
?std;
#define
?N?100000
//
生成不同的隨機數的數組
void
?GetDiffRandomNum(
int
?A[],?
int
?n)
{
????srand(unsigned(time(NULL)));
????
int
?i
=
0
;
????
for
(
int
?index?
=
?n
-
1
;?index?
>
?
0
;?index
--
)
????
{
????????i?
=
?rand()?
%
?index;
????????swap(A[i],?A[index]);
????}
}
int
?main()
{
??
????
int
?A[N]
=
{
0
}
;
????
for
(
int
?i
=
0
;?i
<
N;?i
++
)
????
{
????????A[i]?
=
?i
+
1
;
????}
????GetDiffRandomNum(A,?N);
????
//
DISPLAY(A,?N);
????
????unsigned?
int
?sum?
=
?
0
;
????
double
?logSum?
=
?
0
;
????
for
(i
=
0
;?i
<
N
-
2
;?i
++
)
????
{
????????sum?
+=
?N
-
i
-
A[i];?????????????
????????logSum?
+=
?log(N
-
i)
-
log(A[i]);
????}
????sum?
+=
?
2
?
+
?
1
;
????logSum?
+=
?log(
2
)
+
log(
1
);
????
double
?multi?
=
?exp(logSum);
????
//
兩數的和與積
????cout
<<
int
(sum)
<<
'
\t
'
<<
int
(multi)
<<
endl;
????
//
求出兩數
????
for
(i
=
1
;?i
<=
N;?i
++
)
????
{
????????
double
?temp?
=
?i
*
(sum
-
i);
????????
if
(multi
-
0.5
<=
temp?
&&
?temp?
<=
?multi
+
0.5
)
????????????cout
<<
i
<<
'
\t
'
<<
int
(sum
-
i)
<<
endl;
????}
?
????
return
?
0
;
}
PS(謝謝枝~的幫助)請大家指導
//................................
通過大家的幫助:
得到另一個寫法,不會產生精度問題
(1+N)*N /2 - S = a + b
1/6 * n*(n + 1)*(2n + 1) - X = a*a + b*b
注:
1/6 * n*(n + 1)*(2n + 1)=1*1 + 2*2 + 3*3 +...+N*N
X = A[0]*A[0] + A[1]*A[1] +...A[N-3]*A[N-3]
?
==>
a + b = m
a*a + b*b = n
由于可解出a,b
????unsigned?
int
?sum?
=
?
0
;
????unsigned?
int
?sqrSum?
=
?
0
;
????
for
(i
=
0
;?i
<
N
-
2
;?i
++
)
????{
????????sum?
+=
?N
-
i
-
A[i];???????
????????sqrSum?
+=
?((N
-
i)
*
(N
-
i))?
-
?((A[i])
*
A[i]);
?????
????}
????sum?
+=
?
2
?
+
?
1
;?
????sqrSum?
+=
?
2
*
2
?
+
?
1
*
1
;
posted on 2007-03-22 23:14
豬頭餅
閱讀(3777)
評論(18)
編輯
收藏
引用
所屬分類:
算法/數據結構
FeedBack:
#
re: 一道算法面試題,大家討論看看
2007-03-23 08:25 |
OOKK
注意題只能只掃描一遍數組:
回復
更多評論
#
re: 一道算法面試題,大家討論看看
2007-03-23 08:47 |
萬連文
用5個變量記錄5位數字出現的次數,我想這樣,不知對否
筆試真tmd的米意思
回復
更多評論
#
re: 一道算法面試題,大家討論看看
2007-03-23 08:50 |
OOKK
剛好5個局部變量,剛好對A只掃描了一遍.還可以有更好的做法只需要一個循環就完成
void Func(int A[N-2], int &a, int &b)
{
set<int> oSet;
for(int i=0; i<(N-2); ++i)
oSet.insert(A[i]);
set<int>::iterator idx = oSet.begin();
if(idx == oSet.end())
{
a = 1;
b = 2;
}
else
{
int nCount = 0;
if(1 != *idx)
{
a = 1;
++nCount;
}
if( N != *oSet.rbegin())
{
b = N;
++nCount;
}
if(nCount != 2)
{
set<int>::iterator it = idx;
for(++it; it!=end; ++it, ++idx)
{
switch(*it - *idx)
{
case 2:
if(nCount)
b = *idx+1;
else
a = *idx+1;
++nCount;
break;
case 3:
a = *idx+1;
b = a + 1;
nCount = 2;
break;
}
if(nCount == 2)
break;
}
}
}
}
回復
更多評論
#
re: 一道算法面試題,大家討論看看
2007-03-23 09:03 |
OOKK
void Func(int A[N-2], int &a, int &b)
{
set<int> oSet;
int i, nCount = 0;
for(int i=0; i<N; ++i)
oSet.insert(i+1);
for(int i=0; i<(N-2); ++i)
{
if(oSet.find(A[i]) != oSet.end())
oSet.erase(A[i]);
}
set<int>::iterator idx = oSet.begin();
a = *idx;
++idx;
b = *idx;
}
回復
更多評論
#
re: 一道算法面試題,大家討論看看
2007-03-23 09:09 |
OOKK
void Func(int A[N-2], int &a, int &b)
{
int nCount = 0;
set<int> oSet(A, A+N-3);
for(int i=0; i<N; ++i)
{
if(oSet.find(i+1) == oSet.end())
{
if(nCount)
b = i+1;
else
a = i+1;
++nCount;
if(nCount == 2)
break;
}
}
}
回復
更多評論
#
re: 一道算法面試題,大家討論看看
2007-03-23 11:02 |
david
set這種類型的變量應該不能用吧
回復
更多評論
#
re: 一道算法面試題,大家討論看看
2007-03-23 11:50 |
ChenA
不知道這個只遍歷一次是什么意思,你求sum(A[])不就遍歷了一次?
假設這兩個抽出來的數叫a,b,且a<b。
因為a!=b,那么a<(a+b)/2。
遍歷數組求小于(A+B)/2的A[i]的和,再減去0到i的和就得到了a。
回復
更多評論
#
re: 一道算法面試題,大家討論看看
2007-03-23 12:58 |
shen126
@ChenA
看不懂啊,能不能再明確一點?
假設只有三個數1,2,3;拿掉1,2;然后。。。?
回復
更多評論
#
re: 一道算法面試題,大家討論看看
2007-03-23 20:48 |
豬頭餅
@OOKK
你第一個發布是代碼的思路能簡單的說說嗎?
@ChenA
是啊,我就遍歷了一次數組,求和與積啊。沒有違反規定啊
你說的那個方法能講的再詳細些么?
回復
更多評論
#
re: 一道算法面試題,大家討論看看
2007-03-24 10:06 |
zeeng
太妙了,I LIKE IT.
回復
更多評論
#
re: 一道算法面試題,大家討論看看
2007-03-25 16:24 |
ChenA
最后一步我寫反了,暈。
遍歷數組,求A中小于(a+b)/2的元素的和c,用1到<(a+b)/2的最大整數的和減去c就得到了a。
12345拿掉24
那么a+b =(1+5)*2.5-(1+3+5)=6;
那么a<3
遍歷數組(1,3,5)
所有小于3的數的和c=1
那么a=(1+2)-c=2
b=4
回復
更多評論
#
re: 一道算法面試題,大家討論看看
2007-03-27 11:06 |
aaron
ChenA, 題目中 “把剩下的99998個數順序打亂,并且放入數組A中”,你這樣是按排好序的,不太對吧
回復
更多評論
#
re: 一道算法面試題,大家討論看看
2007-03-27 15:39 |
rome
位圖。。。
回復
更多評論
#
re: 一道算法面試題,大家討論看看
2007-03-28 11:26 |
Qiongzhu
To 豬頭餅:
1到100000之間平方和約有51位2進制位, 使用unsigned int在通常的32位機器上計算過程中會溢出. 應該使用編譯器的擴展長整型, 比如VC的 __int64, 也即 long long 型.
回復
更多評論
#
re: 一道算法面試題,大家討論看看
2007-03-28 14:37 |
BearBlog
+1 Qiongzhu
思路:
遍歷一次數組,求出這兩個數的和a+b 與平方和a*a+b*b
a+b = 1+2+3+4+...+N- sum(A[]); (1)
a*a+b*b = (1*1)+(2*2)+(3*3)+(4*4)+...+(N*N) / sum(A[]*A[]); (2)
假設
m=a+b
n=a*a+b*b
則
a=(m+sqrt((2*n-m*m)))/2
b=(m-sqrt((2*n-m*m)))/2
邊界
N < pow(2, 17)
N*N < pow(2, 34) < pow(2, 63)
1+2+3+4+...+N的值為N*(N+1)/2 < pow(2, 33) < pow(2, 63)
(1*1)+(2*2)+(3*3)+(4*4)+...+(N*N) < N*N*N < pow(2, 50) < pow(2, 63)
使用編譯器的擴展長整型__int64,可以表示和,以及平方和
結論:
只用到三個局部變量
循環中沒有用到浮點數運算
代碼
==================================
#include <iostream>
#include <Ctime>
#include <Cmath>
using namespace std;
#define N 100000
//生成不同的隨機數的數組
void GetDiffRandomNum(int A[], int n)
{
srand(unsigned(time(NULL)));
int i=0;
for(int index = n-1; index > 0; index--)
{
i = rand() % index;
swap(A[i], A[index]);
}
}
// 把這兩個數找出來
void FindOutTwoNumbers(int A[], int nloss2)
{
// 局部變量
__int64 m = 0; // 和 10^5^2
__int64 n = 0; // 平方和 10^5^3
int i;
for (i = 0; i < nloss2; i++)
{
m += (i + 1) - A[i];
n += (i + 1) * (i + 1);
n -= A[i] * A[i];
}
m += (nloss2 + 1) + (nloss2 + 2);
n += (nloss2 + 1) * (nloss2 + 1);
n += (nloss2 + 2) * (nloss2 + 2);
cout<<m<<'\t'<<n<<endl;
cout<<(m+sqrt((double)(2*n-m*m)))/2<<'\t'<<(m-sqrt((double)(2*n-m*m)))/2<<endl;
}
int main()
{
int A[N]={0};
for(int i=0; i<N; i++)
{
A[i] = i+1;
}
GetDiffRandomNum(A, N);
// 抽掉最后兩個數
cout<<A[N-2]<<'\t'<<A[N-1]<<endl;
FindOutTwoNumbers(A, N-2);
return 0;
}
回復
更多評論
#
re: 一道算法面試題,大家討論看看
2007-03-28 18:58 |
豬頭餅
@Qiongzhu
32位是會溢出,所以我寫成這樣:
for(i=0; i<N-2; i++)
{
sum += N-i-A[i];
sqrSum += ((N-i)*(N-i)) - ((A[i])*A[i]); //
}
呵呵。。。
回復
更多評論
#
re: 一道算法面試題,大家討論看看
2007-03-30 17:18 |
塌塌方
cout<<(m+sqrt((double)(2*n-m*m)))/2<<'\t'<<(m-sqrt((double)(2*n-m*m)))/2<<endl;
不知道有問題嗎
回復
更多評論
#
re: 一道算法面試題,大家討論看看[未登錄]
2010-12-04 14:32 |
湯
+1 Qiongzhu
思路:
遍歷一次數組,求出這兩個數的和a+b 與平方和a*a+b*b
a+b = 1+2+3+4+...+N- sum(A[]); (1)
a*a+b*b = (1*1)+(2*2)+(3*3)+(4*4)+...+(N*N) / sum(A[]*A[]); (2)
假設
m=a+b
n=a*a+b*b
則
a=(m+sqrt((2*n-m*m)))/2
b=(m-sqrt((2*n-m*m)))/2
邊界
N < pow(2, 17)
N*N < pow(2, 34) < pow(2, 63)
1+2+3+4+...+N的值為N*(N+1)/2 < pow(2, 33) < pow(2, 63)
(1*1)+(2*2)+(3*3)+(4*4)+...+(N*N) < N*N*N < pow(2, 50) < pow(2, 63)
使用編譯器的擴展長整型__int64,可以表示和,以及平方和
結論:
只用到三個局部變量
循環中沒有用到浮點數運算
正解
回復
更多評論
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
相關文章:
一道算法面試題,大家討論看看
KMP算法資料
網站導航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
Copyright ©2025 豬頭餅 Powered by:
博客園
模板提供:
滬江博客
<
2007年3月
>
日
一
二
三
四
五
六
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
常用鏈接
我的隨筆
我的評論
我參與的隨筆
留言簿
(1)
給我留言
查看公開留言
查看私人留言
隨筆分類
C++(1)
其他
算法/數據結構(2)
隨筆檔案
2007年3月 (1)
2006年11月 (1)
2006年2月 (1)
搜索
積分與排名
積分 - 7530
排名 - 1350
最新評論
1.?re: 一道算法面試題,大家討論看看[未登錄]
評論內容較長,點擊標題查看
--湯
2.?re: [討論]臨時對象有地址么?[未登錄]
cout<<&(i+j)....錯是因為i+j只是一個值沒有分配內存所以不存在地址
下面也不對了
--塌塌方
3.?re: 一道算法面試題,大家討論看看
評論內容較長,點擊標題查看
--塌塌方
4.?re: 一道算法面試題,大家討論看看
評論內容較長,點擊標題查看
--豬頭餅
5.?re: 一道算法面試題,大家討論看看
評論內容較長,點擊標題查看
--BearBlog
閱讀排行榜
1.?一道算法面試題,大家討論看看(3777)
2.?KMP算法資料(1535)
3.?[討論]臨時對象有地址么?(1037)
評論排行榜
1.?一道算法面試題,大家討論看看(18)
2.?[討論]臨時對象有地址么?(10)
3.?KMP算法資料(0)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
国产自产2019最新不卡
|
99精品热视频
|
国内精品免费午夜毛片
|
91久久精品国产
|
欧美精品亚洲二区
|
欧美不卡在线视频
|
久久久久久久久久久一区
|
欧美一区二区三区四区在线观看地址
|
一级日韩一区在线观看
|
99精品欧美一区
|
亚洲理论电影网
|
在线视频欧美精品
|
亚洲欧美国产77777
|
亚洲欧美经典视频
|
欧美综合第一页
|
久久亚洲精品一区二区
|
每日更新成人在线视频
|
久久婷婷国产综合国色天香
|
免费观看亚洲视频大全
|
欧美日本在线
|
国产精品羞羞答答xxdd
|
国产专区欧美精品
|
亚洲国语精品自产拍在线观看
|
亚洲国产日韩欧美综合久久
|
99热精品在线观看
|
亚洲欧美日韩国产成人
|
久久美女性网
|
亚洲欧洲日产国产综合网
|
欧美国产欧美综合
|
欧美大色视频
|
亚洲人成在线免费观看
|
亚洲免费一级电影
|
久久久噜噜噜久久中文字幕色伊伊
|
蜜桃精品一区二区三区
|
欧美日韩亚洲高清一区二区
|
国产精品日韩电影
|
亚洲国产精品视频一区
|
亚洲欧美日韩精品在线
|
久久人人97超碰国产公开结果
|
亚洲欧洲一区二区天堂久久
|
亚洲一二三区在线
|
久久琪琪电影院
|
欧美揉bbbbb揉bbbbb
|
国产一区视频网站
|
99在线热播精品免费
|
久久精品国产清高在天天线
|
亚洲黄色av一区
|
午夜伦理片一区
|
欧美伦理一区二区
|
一区二区三区我不卡
|
亚洲欧美激情四射在线日
|
亚洲欧美经典视频
|
久久频这里精品99香蕉
|
99re热精品
|
免费亚洲电影在线观看
|
国产一区二区三区四区在线观看
|
国产欧美一区二区精品性
|
亚洲三级观看
|
久热国产精品视频
|
亚洲视频在线看
|
欧美日韩亚洲综合一区
|
在线观看日韩专区
|
欧美一级视频
|
一本色道**综合亚洲精品蜜桃冫
|
91久久久久久久久
|
久久精品国产69国产精品亚洲
|
中文久久精品
|
欧美激情一区在线观看
|
欧美在线亚洲
|
国产热re99久久6国产精品
|
99热精品在线
|
亚洲级视频在线观看免费1级
|
久久久另类综合
|
国产一区二区三区日韩
|
欧美一区二区精美
|
亚洲香蕉在线观看
|
国产精品国产三级国产
|
亚洲一区www
|
9久re热视频在线精品
|
欧美国产一区二区三区激情无套
|
狠狠色综合播放一区二区
|
久久久久久伊人
|
久久久激情视频
|
韩国av一区二区三区
|
老牛嫩草一区二区三区日本
|
久久免费视频一区
|
亚洲人成免费
|
在线一区免费观看
|
国产精品一区二区在线
|
久久久成人网
|
久久精品123
|
在线观看一区二区视频
|
欧美顶级艳妇交换群宴
|
欧美成人tv
|
中文国产成人精品久久一
|
亚洲香蕉网站
|
亚洲第一在线综合网站
|
亚洲国产精品va在线看黑人动漫
|
亚洲在线网站
|
亚洲一区中文
|
欧美亚一区二区
|
久久精品国产v日韩v亚洲
|
久久精品中文字幕一区
|
亚洲人成免费
|
先锋影音一区二区三区
|
1769国产精品
|
夜夜狂射影院欧美极品
|
国产自产v一区二区三区c
|
欧美国产日韩一区二区在线观看
|
免费黄网站欧美
|
9色国产精品
|
午夜精品久久久久久久白皮肤
|
国产在线观看一区
|
亚洲国产日韩在线一区模特
|
国产精品高潮呻吟
|
美乳少妇欧美精品
|
欧美日韩一区精品
|
久久亚洲国产精品日日av夜夜
|
男人的天堂亚洲
|
性做久久久久久久免费看
|
久久久噜噜噜久久中文字幕色伊伊
|
亚洲精品孕妇
|
久久激情网站
|
亚洲欧美日韩成人高清在线一区
|
久久免费黄色
|
午夜精品久久久久久久白皮肤
|
欧美日韩一区二区三区免费
|
久久资源在线
|
国产乱子伦一区二区三区国色天香
|
欧美激情精品久久久久久蜜臀
|
欧美性色综合
|
亚洲三级免费电影
|
99精品免费视频
|
欧美日韩国产精品
|
日韩一区二区久久
|
一区二区激情视频
|
欧美色欧美亚洲另类二区
|
亚洲精品一区二区网址
|
日韩视频免费看
|
欧美日韩在线三级
|
中日韩美女免费视频网址在线观看
|
美女精品在线观看
|
久久一区二区三区国产精品
|
欧美图区在线视频
|
一本色道久久综合亚洲精品不
|
亚洲精品美女免费
|
性娇小13――14欧美
|
久久嫩草精品久久久精品
|
欧美国产乱视频
|
亚洲人体一区
|
在线观看不卡av
|
久久久久久9999
|
一区二区三区在线免费观看
|
一区二区三区四区国产
|
亚洲国产一区二区在线
|
欧美电影免费观看高清
|
久久夜色精品国产欧美乱极品
|
国产精品草草
|
性色av香蕉一区二区
|
欧美亚洲一级
|
欧美午夜精品久久久久久孕妇
|
一本一本a久久
|
一区二区三区高清在线
|
免费不卡在线观看
|
在线综合亚洲
|
国产深夜精品福利
|
亚洲欧美视频在线观看视频
|
在线日韩成人
|
欧美二区在线观看
|
亚洲免费观看视频
|
中国日韩欧美久久久久久久久
|
老司机一区二区
|
欧美风情在线观看
|
亚洲天堂激情
|
国产精品永久免费
|
欧美伊久线香蕉线新在线
|
在线综合亚洲
|
国产精品国产三级欧美二区
|
日韩亚洲一区二区
|
在线日韩一区二区
|
国产精品初高中精品久久
|
一本色道久久精品
|
亚洲女同在线
|
最新亚洲一区
|
欧美日韩国产综合网
|
99国产精品久久久
|
欧美成人伊人久久综合网
|
亚洲国产成人久久综合一区
|
裸体一区二区三区
|
欧美亚洲在线播放
|
欧美超级免费视 在线
|
亚洲国产高清一区
|
国产欧美一区二区精品婷婷
|
久久久久.com
|
亚洲欧洲午夜
|
欧美不卡高清
|
亚洲神马久久
|
欧美日韩福利在线观看
|
美女久久网站
|
亚洲影院色在线观看免费
|